Domanda

Windows tramite C / C ++ . E mi chiedo solo un file di grandi dimensioni può essere mappato in memoria.

Quando eseguiamo un'applicazione, un file PE è mappato il loro indirizzo di processo (partizione utente).

In Windows a 32 bit, un file di grandi dimensioni (più grandi di 2 GB) può essere caricato a partizione utente? o sarà riuscito?
Se è possibile, significa file di paging aiutare il carico?

È stato utile?

Soluzione

Non sarà in grado di fare questo su Windows a 32 bit. Qualsiasi programma in esecuzione che vuole fare questo avrà a minimo 3 moduli caricati:

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

yourApplication.exe sarà da carico di default a 0x00400000.exe, anche se è possibile modificare tale indirizzo. ntdll.dll e kernel32.dll caricheranno al loro soliti indirizzi di carico nella gamma alta 0x7Dxx0000.

Su Vista e sistemi operativi successivi al comma precedente non è vero, come gli indirizzi di carico sono randomizzati, ma le DLL sarà ancora presente al proprio indirizzo nel primo 2 GB di memoria.

In questo modo non si avrà abbastanza spazio contiguo ovunque per caricare il file PE eccezionalmente grandi, anche se si avvia Windows con l'opzione / 3GB.

Se si vuole una buona idea di dove le varie DLL verranno caricati, utilizzare VMValidator (gratuito) per visualizzare lo spazio di indirizzamento della vostra applicazione. La memoria virtuale View mostra una rappresentazione grafica (1 pixel per pagina 4Kb) di memoria. I punti di vista Pagine e Paragrafo mostrano lo stato attuale della memoria virtuale di ogni pagina di memoria e la memoria paragrafo.

Per 64 bit di Windows, si può essere in grado di caricare un file PE 2 GB a 64 bit - ci sono certamente dovrebbe essere spazio contiguo enopugh per permettergli di caricare in memoria. Per quanto riguarda se sarebbe poi lavorare non posso dire, si dovrà provarlo.

Altri suggerimenti

No, non è possibile -. Si esaurirà lo spazio VA, indipendentemente dalle impostazioni del file di paging

Non credo che l'intero file è mappato, solamente fino alla dimensione dell'immagine eseguibile (come indicato nell'intestazione PE). Quindi un archivio autoestraente> 2 GB dovrebbe essere possibile. Il codice dovrebbe utilizzare il file standard di I / O per estrarre i dati da l'ultima parte del file, dopo la fine dell'immagine del PE.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top