解惑:老機子(Win95)內存太大也不行?

漫漫開發路 發佈 2020-01-06T04:06:57+00:00

簡單版本如果你的機器的內存高於480MB,則Win95將啟動失敗。(話說在當時,480MB的內存已經是一個非常大的內存了。要知道Win95的目標運行環境是一台配備有4MB內存的385SX,或者一台帶有16MB的高配機器。

簡單版本

如果你的機器的內存高於480MB,則Win95將啟動失敗。(話說在當時,480MB的內存已經是一個非常大的內存了。要知道Win95的目標運行環境是一台配備有4MB內存的385SX,或者一台帶有16MB的高配機器。如果根據摩爾定律,要經過差不多7年的時間,我們才需要考慮一台配備有480MB內存的機器的問題。我的一個朋友擁有一台96MB內存的機器,經過測試,機器能正常啟動。)

到了Win98,這一限制被提升至1GB。因為那個時候有一家供應商需要售賣搭載有Win98的1G內存的機器。雖然在這種情況下,選擇WinNT更好。

複雜版本

Win95啟動過程中,一旦系統進入到32位模式之後,第一件發生的事情就是需要初始化32位內存管理器。但這時就會出現一個」雞」與」蛋」的問題:內存管理器在初始化階段需要分配一些內存來保存一些記錄(這些記錄主要是用來追蹤頁面的Paged in和Paged out狀態的)。但是,在內存管理器初始化完成之前,它又不能分配任何內存。

解決此問題的方法是:讓內存管理器初始化兩次!

第一次初始化的時候,它從一段預先分配的固定內存(來自init-data段)中獲取所有內存。然後將此固定內存設定為內存管理器的堆。因此,對於接下來的內存分配來說,系統就有一個可用的堆來滿足初始化過程中的內存分配需求了。

然後,內存管理器將會開始尋找系統中真正可用的內存,如果它找到了,它會在之前的固定堆內存中分配內存來保存追蹤到的記錄。

等到內存管理器找到了系統中所有的真實內存之後,它就開始進行第二次初始化:它將找到的真實內存作為一塊新的堆,然後拷貝固定堆中的信息到新的堆中。在所有的信息都拷貝完畢後,全局內存管理器的堆指針將會從原來的固定堆切換為新的堆上。原來的固定堆內存將會被丟棄。

當系統完成初始化後,init-data段會被釋放,隨之而來的,第一次初始化中的固定堆內存將會重新被系統識別。

所以,init-data段中的固定堆大小直接決定了系統的最大內存限制。這個限制必須足夠大,使之可以滿足在內存搜索過程中的內存分配需求,如果你用於非常多的內存,則在內存搜索過程中,內存分配操作會失敗,導致整個系統立即停機。

init-data段的大小的選擇取決於兩個因素:如果將它設置為越大,則你將會擁有更多的可用內存。但是你也不能將它設置為太大,因為對於一些只有少量內存的低配機器來說,如果這個段設置的太大,則將內存管理器加載到內存中是不可行的,這就直接導致了系統無法運行在這些的低配機器上。

總結

誰能想到,16年後,主流機器的內存配置都是8GB了,真是難為VMM的設計者了。向你們致敬。


關鍵字: