2010-03-22 2 views
1

나는 Windows via c/c++을 읽고 있습니다. 큰 파일을 메모리에 매핑 할 수 있을지 궁금합니다.2GB보다 큰 PE 파일

응용 프로그램을 실행하면 PE 파일이 프로세스 주소 (사용자 파티션)에 매핑됩니다.

32 비트 Windows에서 대용량 파일 (2GB 이상)을 사용자 파티션에로드 할 수 있습니까? 아니면 실패할까요?
가능한 경우 페이징 파일이로드에 도움이됩니까?

+3

** 왜 ** 2GB PE 파일이 있습니까? – SLaks

+0

나는 그렇지 않습니다. 나는 그저 걱정하고있다. – Benjamin

+0

왜? 왜 당신은 2GB의 PE 파일을 가지고 있습니까? – SLaks

답변

1

32 비트 Windows에서는이 작업을 수행 할 수 없습니다. 이 작업을 수행하고자하는 모든 프로그램의 실행이로드 최소 3 개 모듈에서해야합니다 :

  • NTDLL.DLL
  • KERNEL32.DLL
  • yourApplication.exe

yourApplication.exe 것이다 디폴트의 부하로 0x00400000.exe에 있지만 주소를 변경할 수는 있습니다. ntdll.dll 및 kernel32.dll은 보통 0x7Dxx0000 범위의로드 주소에서로드됩니다.

Vista 이상의 운영 체제에서로드 주소가 임의로 지정 되었기 때문에 위 단락은 사실이 아니지만 dll은 처음 2GB 메모리의 자체 주소에 여전히 존재합니다.

따라서/3GB 스위치로 Windows를 시작한 경우에도 예외적으로 큰 PE 파일을로드 할 수있는 충분한 공간이 없습니다.

다양한 DLL이로드되는 위치를 알고 싶다면 VMValidator (무료)을 사용하여 앱의 주소 공간을 시각화하십시오. 가상 메모리보기는 4KB 페이지 당 1 픽셀의 그래픽 표현을 보여줍니다. 페이지 및 단락보기는 각 메모리 페이지 및 메모리 단락의 실제 가상 메모리 상태를 보여줍니다.

64 비트 Windows의 경우 2GB 64 비트 PE 파일을로드 할 수 있습니다. 확실히 메모리가로드 될 수 있도록 인접한 공간이 있어야합니다. 그것이 작동하는지 여부에 관해서는 내가 말할 수 없다. 당신은 그것을 시험해야 할 것이다.

2

아니요, 페이징 파일 설정에 관계없이 VA 공간이 고갈됩니다.

1

전체 파일이 매핑되지 않았다고 생각합니다 (PE 헤더에 나열된) 실행 가능 이미지의 크기까지만 생각합니다. 따라서 자동 압축 풀림 보관소> 2GB가 가능해야합니다. 코드는 표준 파일 I/O를 사용하여 PE 이미지의 끝 부분에 따라 파일의 후반 부분에서 데이터를 추출해야합니다.