Pergunta

eu estou lendo Windows via C/C ++. E eu apenas me pergunto um arquivo grande pode ser mapeado para a memória.

Quando executamos um aplicativo, um arquivo PE é mapeado seu endereço de processo (partição do usuário).

No Windows de 32 bits, um arquivo grande (maior que 2 GB) pode ser carregado para a partição do usuário? Ou isso falhará?
Se for possível, o arquivo de paginação ajuda o carregamento?

Foi útil?

Solução

Você não poderá fazer isso em janelas de 32 bits. Qualquer programa em execução que queira fazer isso terá no mínimo 3 módulos carregados:

  • ntdll.dll
  • kernel32.dll
  • yourApplication.exe

YourApplication.exe, por padrão, carregará em 0x00400000.exe, embora você possa alterar esse endereço. Ntdll.dll e Kernel32.dll carregarão em seus endereços de carga usuais na faixa alta 0x7dxx0000.

No Vista e nos sistemas operacionais posteriores, o parágrafo acima não é verdadeiro, pois os endereços de carga são randomizados, mas as DLLs ainda estarão presentes em seu próprio endereço nos primeiros 2 GB de memória.

Portanto, você não terá espaço contíguo suficiente para carregar seu arquivo PE excepcionalmente grande, mesmo se você iniciar o Windows com o interruptor /3 GB.

Se você quiser uma boa idéia de onde as várias DLLs serão carregadas, use VmValidator (gratuito) para visualizar o espaço de endereço do seu aplicativo. A exibição de memória virtual mostra uma representação gráfica (1 pixel por página de 4KB) da memória. As páginas e as visualizações de parágrafo mostram o status de memória virtual real de cada página de memória e parágrafo da memória.

Para Windows de 64 bits, você poderá carregar um arquivo PE de 2 GB de 64 bits - certamente deve haver espaço contíguo eneropa para permitir que ele seja carregado na memória. Quanto a funcionar então, não posso dizer, você terá que testá -lo.

Outras dicas

Não, você não pode - você esgotará seu espaço VA, independentemente da configuração do arquivo de paginação.

Não acho que o arquivo inteiro seja mapeado, apenas até o tamanho da imagem executável (conforme listado no cabeçalho do PE). Portanto, um arquivo de extração de auto-extração> 2 GB deve ser possível. O código teria que usar o arquivo de arquivo padrão para extrair seus dados da última parte do arquivo, seguindo o final da imagem PE.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top