概念
線性地址是一個32位無符號整數,可以用來表示高達4GB的地址,也就是,高達4294967296個記憶體單元。線性地址通常用十六進制數字表示,值的範圍從0x00000000到0xffffffff)。 程式代碼會產生邏輯地址,通過邏輯地址變換就可以生成一個線性地址。如果啟用了分頁機制,那么線性地址可以再經過變換以產生一個物理地址。當採用4KB分頁大小的時候,線性地址的高20位為頁目錄項在頁目錄表中的編號,中間十位為頁表中的頁號,其低12位則為偏移地址。如果是使用4MB分頁機制,則高10位頁號,低22位為偏移地址。如果沒有啟用分頁機制,那么線性地址直接就是物理地址。
線性地址與分頁管理
CPU的頁式記憶體管理單元,負責把一個線性地址,最終翻譯為一個物理地址。從管理和效率的角度出發,線性地址被分為以固定長度為單位的組,稱為頁(page),例如一個32位的機器,線性地址最大可為4G,可以用4KB為一個頁來劃分,這頁,整個線性地址就被劃分為一個tatol_page[2^20]的大數組,共有2的20個次方個頁。這個大數組我們稱之為頁目錄。目錄中的每一個目錄項,就是一個地址——對應的頁的地址。
如上圖:
1、分頁單元中,頁目錄是唯一的,它的地址放在CPU的cr3暫存器中,是進行地址轉換的開始點。萬里長征就從此長始了。
2、每一個活動的進程,因為都有其獨立的對應的虛似記憶體(頁目錄也是唯一的),那么它也對應了一個獨立的頁目錄地址。——運行一個進程,需要將它的頁目錄地址放到cr3暫存器中,將別個的保存下來。
3、每一個32位的線性地址被劃分為三部份,面目錄索引(10位):頁表索引(10位):偏移(12位)
依據以下步驟進行轉換:
1、從cr3中取出進程的頁目錄地址(作業系統負責在調度進程的時候,把這個地址裝入對應暫存器);
2、根據線性地址前十位,在數組中,找到對應的索引項,因為引入了二級管理模式,頁目錄中的項,不再是頁的地址,而是一個頁表的地址。(又引入了一個數組),頁的地址被放到頁表中去了。
3、根據線性地址的中間十位,在頁表(也是數組)中找到頁的起始地址;
4、將頁的起始地址與線性地址中最後12位相加,得到最終我們想要的物理地址;