天天看點

/3GB開關并不能映射一個3GB大小的記憶體

如果你使用了/3GB,則你得到一個3GB的虛拟位址空間,但這并不意味着你可以映射一個3GB大小的記憶體塊。在這個位址空間中會有一些标準的”空洞”,例如:位于位址空間底部的64KB,以及位于2GB邊界的64KB。

而且,系統DLL會繼續在它所希望的記憶體位址加載,這些記憶體位址通常位于位址空間中的2GB邊界下方,另外,程序堆和其他典型的程序結構記錄資訊也會占用你的虛拟位址空間。結果就是,盡管使用者模式的虛拟位址空間接近有3GB,但是并不是所有的可用空間都是連續的。2GB邊界附近的空洞會阻止你配置設定2GB的連續位址空間。

有些人可能會嘗試将系統DLL重新定位到其他位址以建立更多空間,但由于多種原因,這不起作用。

首先,當然是它沒有擺脫2GB邊界附近的64K的間隙。

其次,系統會在你的程式有機會開始運作之前配置設定其他項目,例如線程資訊塊和程序環境變量,是以當你的程式開始配置設定記憶體時,它想要的空間可能已經被占用。

第三,系統确實需要在所有程序中将某些關鍵DLL加載到相同的位址。例如,系統調用陷阱必須駐留在固定位置,以便核心模式陷阱處理程式将其識别為有效的系統調用陷阱而不是非法指令。

調試器也需要這樣做,以便當你告訴它攔截正在調試的程序時,它可以使用CreateRemoteThread将斷點注入程序。

最後

最近我寫了個東西

繼續閱讀