PE 파일의 어떤 부분이 MS 로더에 의해 메모리로 매핑됩니까?MS 로더가 PE 파일의 어떤 부분을 메모리에 매핑합니까?
PE 설명서에서 PE 실행 파일의 일반적인 형식을 추론 할 수 있습니다 (아래 참조).
섹션 헤더를 포함하여 PE 파일의 모든 내용이 디스크에 저장된 것과 똑같이 메모리에 매핑된다는 것을 조사하여 알고 있습니다.
다음에 어떤 일이 발생합니까?
파일의 나머지 부분도 매핑되어 있습니다 (아래 그림의 이미지 페이지 부분 참조). 그러면 전체 파일이 정확히 디스크에 저장된 것과 같은 메모리에 저장되거나 그보다 더 선택적입니다 ? 속성 인증서 테이블,
또 다른 예외가 이미지 파일의 맨 끝에 배치해야 그 속성 인증서 및 디버그 정보는 다음과 같습니다 문서에서
, 나는 다음 코드를 발견했습니다 로더가이를 메모리로 맵핑하지 않기 때문에 디버그 섹션 바로 앞에서. 그러나 속성 인증서 및 디버그 정보에 대한 규칙은 객체 파일 에 적용되지 않습니다.
이것은 실제로 로더 동작에 관한 모든 것입니다. 이 두 부분은 메모리에 저장되지 않기 때문에 파일의 마지막 부분에 배치해야합니다.
그러나 로더가이 두 부분을 제외한 모든 항목을로드하고 섹션 RVA를 충분히 높게 설정하면 섹션 데이터가 실제로 메모리에 복제됩니다 (매핑 된 파일에서 한 번, RVA에서 지정한 위치에 한 번) ?
가능하면 MS Windows 전용로드에 대한 추가 정보가있는 곳으로 연결하십시오. MS는 항상 COFF의 설명을 & T 약관 AT 사용하는 경우에 자신의 용어를 사용하여 주장하기 때문에
로드 된 것과 매핑 된 것의 차이점 : 거대한 exe는 메모리에 매핑 될 때 실제로 디스크에서 읽지 않아도됩니다. 큰 파일을 매핑하고 메모리로 요구 페이징 할 수 있습니다. 질문 제목에 "loaded"라고 쓰여 있지만 프로그램 로더가 어떻게 매핑했는지 묻는 중입니다. –
수정되었습니다. 감사합니다. – Shuzheng
전체 PE 파일은 memory-mapped-file 메커니즘을 사용하여 메모리로 매핑됩니다. 후속 액세스 시도로 인해로드가 트리거되는 페이지 폴트가 발생합니다. 당신이 요구하는 대부분의 것들이 당신이 의존해서는 안되는 구현 세부 사항 인 것 같습니다. 의도적으로 문서화되지 않은 것. 어떤 문제를 해결하려고하는지 명확하지 않습니다. RVA는 파일이 메모리 맵핑 된 위치와 관련하여 단순히 오프셋에 불과하기 때문에 메모리에 중복되는 부분이 어떤지 이해하지 못합니다. –