這是我找到的關於虛擬記憶體和分頁機制的我個人比較容易理解的一篇文章。
虛擬儲存器的思想是程式、資料和堆疊的大小都有可能超過物理記憶體大小,由作業系統把當前使用的放在記憶體,而不需要的放在磁碟。
而絕大部分作業系統使用的虛擬儲存器技術就是分頁技術。
在虛擬儲存器中,程式所產生的位址為虛擬位址,虛擬位址構成了虛擬位址空間。(當然了在沒有虛擬儲存器的系統上,程式產生的位址就是實體地址。其實程式並不知道,只是作業系統和處理器知道。下面都是按照使用虛擬儲存器的系統來說)這些虛擬位址通過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.應用程式通過使用它的虛擬位址空間中的位址開始執行,然後虛擬記憶體管理器把每次的記憶體訪問對映到物理位置。
虛擬記憶體,對映,分頁機制
這是我找到的關於虛擬記憶體和分頁機制的我個人比較容易理解的一篇文章。虛擬儲存器的思想是程式 資料和堆疊的大小都有可能超過物理記憶體大小,由作業系統把當前使用的放在記憶體,而不需要的放在磁碟。而絕大部分作業系統使用的虛擬儲存器技術就是分頁技術。在虛擬儲存器中,程式所產生的位址為虛擬位址,虛擬位址構成了...
虛擬記憶體,對映,分頁機制
這是我找到的關於虛擬記憶體和分頁機制的我個人比較容易理解的一篇文章。虛擬儲存器的思想是程式 資料和堆疊的大小都有可能超過物理記憶體大小,由作業系統把當前使用的放在記憶體,而不需要的放在磁碟。而絕大部分作業系統使用的虛擬儲存器技術就是分頁技術。在虛擬儲存器中,程式所產生的位址為虛擬位址,虛擬位址構成了...
虛擬記憶體 分頁機制
1.2 分頁 1.3 頁表 1.4 加速分頁過程 1.5 針對大記憶體的頁表 虛擬記憶體的基本思想 每個程式都有自己的位址空間,這個空間被分割成多個塊,每乙個塊被稱作一頁或頁面。每一頁有連續的位址範圍。這些頁被對映到物理記憶體,但並不是所有的頁都必須在記憶體中才能執行程式。當程式引用到一部分在物理記...