天天看點

為什麼32位系統上虛拟位址空間是4GB

在一台32位系統上,虛拟位址空間為4GB,這個大小由系統上指針的可用數量決定。

對于一塊32位的處理器,一個32位值可以表達232個不同的數值,如果你将每一個數值都指向不同的記憶體位址,則你就得到了一個232個位元組的位址空間,也就是4GB。

如果你願意放棄平坦記憶體模型(flat memory model)并使用選擇器(selectors),那麼你可以将16 位選擇器值與32位偏移量組合為一個48位的指針值。從理論上來說,這将建立高達248個不同指針值,如果你允許每個指針值尋址不同的記憶體位元組,則會産生 256TB 的記憶體。雖說理論上可以達到如此巨大的記憶體空間,但是在奔騰級CPU上這個理論最大值無法支援。

一個原因是,段選擇器中的低位會用來攜帶段選擇器的類型資訊。是以,結果就是,一個16位段選擇器可以有65536個不同數值,但是其中隻有8191個數值可以用來進行尋址使用者模式資料,也就是說最大位址空間會降至32TB。使用selector:offset這種尋址模型對位址空間的真正限制是:每個選擇器隻描述了平面32位位址空間的一個子集。

是以,即使你能使用到所有的8191個段選擇器,它們都隻是對同一個底層32位位址空間的特定視圖。

(另外,我覺得不會有人希望回到使用段選擇器來尋址吧? 那可是一段瘋狂的時代。)

在64位的Windows系統上,2GB位址空間限制就沒有了,使用者模式虛拟位址空間可以達到8TB。8TB有多大?這樣說吧:從現在開始,你每秒鐘都從這8TB的虛拟位址空間中配置設定1MB的記憶體,也需要整整3個月才能配置設定完。

(但請注意,你可以在64位程式上設定/LARGEADDRESSAWARE:NO開關,來告訴作業系統強制程式運作在2GB邊界以下。不過,我還不大清楚你為什麼要這樣做,因為這樣你隻能使用龐大的64位位址空間中的很小一部分,同時,指針還是一個64位的指針。這就好比,你有線電視付費了但是不看一樣。)

有了到目前為止你所學到的知識,也許你可以回答下面這個問題:

“我們的boot.ini檔案中有一個/7GB開關。我們的技術顧問告訴我們,我們應該将其設定為比系統記憶體少1GB。因為我們的系統配備了8GB記憶體,是以8GB – 1GB = 7GB。顧問表示,設定此值允許應用程式配置設定超過 2GB的記憶體。我們希望微軟對此分析發表評論。”

總結

對于上面的問題,聰明如你,是一定有辦法回答的。

沒錯吧?

最後

最近我寫了個東西

繼續閱讀