1. 程式人生 > >虛擬核心和程序地址空間

虛擬核心和程序地址空間


地址空間和記憶體
        地址空間和記憶體是不同概念,地址空間是CPU所能管理記憶體的範圍,4GB地址空間不表示4GB實體記憶體。但4G大小虛擬地址空間的資料肯定會對應4G大小實體記憶體的資料。按32位Windows來說,虛擬地址空間是4GB,虛擬記憶體地址的最大值是4GB-1,並不是一開始就有4GB,而是要通過系統來“分配”之後才有的。
        程序地址空間也是4GB,前2GB是使用者地址空間,是每個程序獨立的;後2GB是系統地址空間,是各個程序共享的。所謂“共享”是指這段空間屬於所有程序,而不是不屬於某個程序,在核心中同樣是要區分程序的。“程序地址空間也是4GB”,“按32位Windows來說,虛擬地址空間是4GB。

程序地址空間也是4GB,前2GB是使用者地址空間,是每個程序獨立的:

        這句話可以說明程序的使用者地址空間是獨立的,但沒有體現出地址空間的大小。真正的虛擬記憶體,是由核心管理的記憶體對映表(系統分配),由多級目錄組成,而程序管理的虛表,最終指向核心管理的記憶體對映表,解釋出指向的記憶體物理區塊。(這就可以解釋不同的程序,同樣的虛址,指向不同的記憶體)系統空間是為系統預留的(不知道存放的是什麼);核心分配的資料,只有核心可直接訪問(如,驅動的對映,核心物件表等)。
        虛擬記憶體與實體記憶體相對應,虛擬記憶體對映到硬碟的系統分頁檔案上,這玩意完全是由作業系統控制的。4GB是32位系統的最大地址編碼(以前叫定址空間),這是由32根地址線決定的,與 CPU的字長無關(字長表示:在同一時間中處理二進位制數的位數叫字長。字長與資料匯流排有關

        理論上,如果實體記憶體足夠大,就不需要使用分頁檔案(慢),但是事實上不是這樣,這可能是由於多工的特性決定的,我們寫的程式執行時的地址其實都是虛擬的(假的程序空間,根據需要分配實體記憶體或者交換到分頁檔案),這裡說的虛擬與虛擬記憶體的概念不同,看來大家都認同:
        虛擬記憶體空間和程序的虛擬地址空間是不同的,而且真正執行時程序的虛擬地址空間會對映到虛擬記憶體空間。

後2GB是系統地址空間,是各個程序共享
        “所謂“共享”是指這段空間屬於每個程序”,是不是每個程序的這部分空間裡的東西都是一樣的,當切換執行緒時,虛擬地址空間的前2GB對映會根據所屬程序而變化,後2GB對映是不變的。核心分配的資料,只有核心可直接訪問(如,驅動的對映,核心物件表等)。
        所用使用者程序的2GB-4GB地址空間,都無法被程序自己的使用者程式碼所訪問的。“程序實際的使用者空間”指的是程序的地址空間,是2GB的。“程式啊,資料什麼的都沒有那麼大”,因此OS只會把這些程式和資料對映到地址空間中,即Reserved和Committed的記憶體總和,是會小於或遠小於2GB的。

程序後2G的空間是在什麼時候對映的? 

        應該是在Windows啟動的時候,就建立好了一張所有程序共享的系統的頁表,每當程序呼叫系統API陷入核心模式後,訪問高階2GB地址時,會去查詢系統的那張共享頁表,得到實際實體記憶體地址。