2013-01-07 58 views

回答

2

爲什麼在32位Windows系統進程不能滿足內存

4GB但他們肯定可以。您的代碼通常不具有訪問地址空間上部所需的訪問權限。用戶模式代碼在第3環運行,爲了達到上層部分,您需要使用ring 0訪問權限。內核模式。

好的,這有點兒尷尬,操作系統內核和具有ring 0訪問權限的驅動程序通常不會被認爲是該進程的一部分。儘管它們在邏輯上是,但它們在每個過程中映射到相同的地址。從技術上講,可以動態地映射頁面,因爲進程從環3切換到環0模式,但這會使內核模式轉換太昂貴和麻煩。

直觀地說:由ReadFile()填充的文件緩衝區可能具有與操作系統代碼或數據塊重疊的地址。最壞的情況是,它可能會覆蓋文件系統驅動程序代碼。或者更有可能的是文件系統緩存。所需的翻頁和雙面複印會使讀數變得難以預測。最簡單的架構選擇,以及1992年沒有人提供足夠內存的RAM時,只需簡單地將地址空間分成兩部分,這樣就不會有任何重疊。

這是另一個解決的問題,32位版本的Windows變得越來越少,32位進程可以地址在64位版本的Windows上的4千兆字節。它只需要EXE頭中的一個選項位,由鏈接器和editbin.exe中的/ LARGEADDRESSAWARE選項設置一個選項位。

+0

此限制是否存在於Linux中? – BlueTrin

2

的簡單的答案是,某些虛擬地址空間是保留給OS映射到的東西,比如自己的內存空間中,VM頁表,硬件設備等

它可以在理論使得更多可用(事實上,你可以告訴Windows允許你有〜3GB,儘管它在默認情況下沒有啓用,以防某些軟件/驅動程序等出現問題),但是如果沒有癱瘓,你將無法獲得完整的4GB容量操作系統有效運行系統的能力。

即使您在Windows上將用戶佔用空間擴大到3GB,應用程序也不會默認獲得額外的範圍。 Windows需要應用程序設置標誌(在MSVC下使用/ LARGEADDRESSAWARE構建,不知道其他構建環境)還是限制爲2GB,以避免軟件對地址做出假設導致的任何問題。

相關問題