虛擬內存,映射,分頁機制

這是我找到的關於虛擬內存和分頁機制的我個人比較容易理解的一篇文章。

虛擬存儲器的思想是程序、數據和堆棧的大小都有可能超過物理內存大小,由操作系統把當前使用的放在內存,而不需要的放在磁盤。 

        而絕大部分操作系統使用的虛擬存儲器技術就是分頁技術。 
        在虛擬存儲器中,程序所產生的地址爲虛擬地址,虛擬地址構成了虛擬地址空間。(當然了在沒有虛擬存儲器的系統上,程序產生的地址就是物理地址。其實程序並不知道,只是操作系統和處理器知道。下面都是按照使用虛擬存儲器的系統來說)這些虛擬地址通過MMU(內存管理單元)映射爲物理地址。 
        採用分頁機制的系統,虛擬地址空間以頁面爲單位進行劃分,虛擬地址空間會被劃分成多個等大小的頁面。物理地址空間也按頁面爲單位進行劃分每一塊成爲頁幀,或者頁框。每一虛擬頁面可以隨意對應到物理頁框,也可以對應到磁盤的頁面文件的上。 
        我們按照IA32的分頁機制來說,標準頁面大小爲4K。 
        例如一條mov指令:mov   eax,[0]; 
        此時虛擬地址0將被髮給MMU,MMU發現0屬於頁面0的範圍內,如果頁面0對應的頁框號爲1,那麼物理地址在物理地址4096-8191範圍,此時就會將4096發送到地址總線上。因爲虛擬地址0的頁內偏移也是0(頁內偏移:在頁面裏的位置,比如1,的頁面偏移是1,4097的頁面偏移也是1,這是因爲一個頁面大小爲4K,用虛擬地址   mod   4k就得到了頁內偏移)。 
        就類似mov   eax,[4095];mov   eax,[4096],4095屬於頁面0,頁面0對應頁框1,那麼物理地址爲8191,而4096屬於頁面1的範圍,如果頁面1對應頁框0,此時的物理地址就是0。 
        由上面可以看出,虛擬地址空間是連續的,而物理空間是可以不連續的。也就是說一個程序只要保證他的虛擬地址空間是連續的,它就可以正常運行。 
        上面說的是虛擬地址到物理地址的映射的簡單情況。可是如何記錄這些頁面到頁框的映射關係呢?(當然也有些處理器系統是頁框到頁面的轉化)。在IA處理器上使用的是頁表,就是在物理內存裏有一塊連續的空間,來記錄這些頁面到頁框的映射關係。每一個頁表項裏都有一部分去指向頁框的起始地址,還有部分記錄了這個頁面的屬性。可以通過頁面號來做索引。頁面號就是虛擬地址   /   4K,得到的整數部分。 
        當然如果只是單一的頁表,也是有問題的,如果虛擬地址空間過大,那麼頁表所佔的空間也會很大,這時候可以採用多級頁表。IA32在採用4K頁面的時候就使用了2級頁表,IA64使用了4級。 
        其實兩級也很簡單,最上一級就是一個總的目錄指示每一個二級頁表的起始物理地址,可以在頁號的高几位來索引頁目錄項。例如IA32就是通過虛擬地址的高10位來索引頁目錄項,然後中間10位來索引頁表項。 
        這樣,我們就可以只將用到的虛擬地址空間的頁表寫入內存,而沒有用到的虛擬地址空間的頁表就不寫入。

        例如,我們正好是隻用了虛擬地址0-0x3FFFFF,那麼我們可以在頁目錄第0項指向一個頁表,這個頁表就只表示了虛擬地址地址0-0x3FFFFF到物理地址空間的映射關係(因爲高10位爲頁目錄索引,頁目錄第0項,就表示了虛擬地址高10位必爲0,也就是說只有低24位有效,所以最大隻能到0x3FFFFF)。 

虛擬內存的實現方法-------摘自《加密與解密》

1.當一個應用程序被啓動時,操作系統就創建一個新進程,並給每個進程分配2gb的內存地址(不是內存只是地址)。

2.虛擬內存管理器將應用程序的代碼映射到那個程序的虛擬地址中得某個位置,並把當前所需的代碼讀取到物理地址中。

3.如果使用動態鏈接庫DLL,DLL也被映射到進程的虛擬地址空間,在需要的時候才被讀入物理地址。

4.其他項目(如數據,堆棧)的空間是從物理地址中分配的,並被映射到虛擬地址空間中。

5.應用程序通過使用它的虛擬地址空間中的地址開始執行,然後虛擬內存管理器把每次的內存訪問映射到物理位置。

發佈了56 篇原創文章 · 獲贊 21 · 訪問量 26萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章