windows 32位 為什麼實際可用最大內存只有3G?

windows 32位定址空間為4G, 為什麼實際可用最大內存只有3G,包括系統使用內存和用戶使用內存。之前以為是因為有標誌位的問題導致定址能力下降,但並沒有科學依據。

希望能夠有朋友介紹原理,並能夠告知精確的多少M內存無法被使用和看到,為什麼?


首先你要知道,內核在每個進程的地址空間中都必須存在。因為所有syscall和中斷都是在不切換頁表的情況下處理的,所以必須保證不管當前正運行的是哪個進程,都必須保證CPU能找到用來處理中斷的代碼。這也要求了內核必須總在內存中處於一樣的位置(或者每次切換進程都把IDT和STAR重新寫一遍,出於性能考慮肯定不能這麼做)。

不光內核的代碼必須在同一個地方,所有內核分配的內存也不能移動。你想像一下,內核里肯定有很多地方都存著指向內存區域的指針,只要一移動,就全亂套了。

所以結論就是,我們必須事先給內核找好一塊地方放著。所以Win和Linux就做了決定,把整個地址空間(注意,是地址空間,不是物理內存)分成了3G/1G兩部分。1G給內核,3G給用戶程序。如果你的內存少於3G,那麼這對你沒有影響。如果多於3G,那你最多只能用3G。

你可能會說,內核不能用多少要多少嗎,為什麼一口氣佔了1G?你可以想像一下這種情況:

1.現在當前進程用了3G,內核分配並使用了1G

2.切換到一個只使用了2G內存的進程

3.因為有空餘,內核又分配了500M

現在內核要怎麼切換到之前那個3G的進程?


謝邀,不過這類問題是不是問度娘會更好?好吧,總之謝謝邀請。

32位系統的最大定址空間是2^32=4G。而計算機不僅需要對內存條定址,還需要對BIOS、其他硬體緩存等進行定址,大約佔用700M左右(具體因機器而已)。因此,當你插上4G以上的內存條時,實際全部存儲資源是超過最大定址空間的。而由於BIOS等硬體定址優先順序較高,因此內存條就約有700M無法定址到,故實際可用內存只有3G多。

下面這幅圖解釋地非常清楚,原圖來自這篇帖子:4GB的內存條在32位Win7 系統中只能顯示為3GB左右的原因~


補充一下,啟用PAE後就可以突破這個限制。然而client版本的windows是禁用PAE的,真的想用網上有修改工具,比如有個叫Ready for 4gb的,可以改kernel支持pae(只需要改幾個位元組)。

由於驅動程序的各種問題,啟用pae後果自負。


推薦閱讀:

進程和線程之間有什麼根本性的區別,我總感覺線程是進程的進化版?求解答
Linux中進程具有父子層次結構,Windows中沒有進程層次,這兩種設計各有什麼優劣?
NT 之後操作系統內核是否就毫無長進了?
Linux 內核為什麼沒有第三方的版本或分支?
不懂彙編可以學 Linux 內核嗎?

TAG:MicrosoftWindows | 計算機科學 | 操作系統內核 | 體系結構 | 計算機組成原理 |