內存虛擬化硬件基礎——分頁模式

  • 內存分頁是將線形地址轉化成物理地址的過程,如果把分頁過程看做一個函數,其輸入爲線形地址,輸出爲物理地址。不同的分頁模式對應不同的函數表達式,有不同的實現。X86有三種分頁模式,分別是:32-bit,PAE,4-level。三種分頁模式由三個寄存器的標記位控制,分別是CR0.PG,CR4.PAE,IA32_EFER.LME。三種模式都是在保護模式(CR0.PE)開啓的情況下所設置的模式。分頁模式中頁的大小可設置,不同大小的頁需要不同位寬的地址來索引,本節默認頁大小4K,因此索引該頁內的所有內容需要12bit位寬的地址。
  • 不同的分頁模式其尋址能力有所不同,這取決於頁表項設計,頁表項中存放的物理地址位寬決定了尋址能力。三種分頁模式下頁表項中存放的物理地址位寬各有不同,32-bit分頁模式頁表項物理地址位寬爲32位,因此物理地址的尋址能力爲4G;PAE分頁模式頁表項物理地址位寬最大可配置爲52位,因此尋址能力爲4P;4-leve分頁模式和PAE分頁模式相同,頁表項物理地址位寬最大可配置位52位,尋址能力爲4P。

32-bit模式

  • 32-bit分頁模式是分頁開啓後的默認模式,CR0.PG被置位後默認進入32-bit的分頁模式。該模式下只支持32位的線性地址作爲輸入,並將其轉化爲32位的物理地址。任意時刻只有4G的線性空間可以被訪問。

層級結構

  • 32-bit分頁模式通過三級索引實現線性地址到物理地址的映射,如下圖:
    在這裏插入圖片描述
    32-bit分頁模式下,CR3存放的是頁目錄的物理地址,地址轉換時首先通過CR3查找到頁目錄,再從頁目錄中查找頁表的物理地址,最後從頁表中查找目標頁面的物理地址。線性地址轉換時定位頁表項的過程爲CR3 -> PDE -> PTE -> Page Physical Address

PTE/PDE

  • 線性地址低12位的最大尋址能力是4K,通過它可以從一個頁面內找到任意地址的內存;中間10位用來在一個擁有2^10=1024個條目的頁表中查詢目標項,由於頁表存放的單位也是頁,因此一個頁面如果作爲頁表,其每個條目的長度是4K / 1024 = 4Byte = 32bit。頁表項PTE(Page Table Entry)的格式如下:
    在這裏插入圖片描述
  • 因爲PTE指向的是物理頁的地址,物理頁總是4K(或者大於4K)對齊的,所以物理頁地址的低12位總是爲0。因此PTE不需要將低12位記錄下來,而是利用這12位做其它事情,比如描述所映射的物理頁,Intel就是這麼設計的,PTE的低12位存放描述物理頁的元數據。這些信息包括物理頁是否被分配(bit0 = Present),頁是否可寫(bit1 = R/W),用戶特權級是否可以訪問此頁(bit2 = U/S),頁cache是否打開(bit4 = PCD),是否爲髒頁(bit6 = Dirty),用戶程序是否具有對該頁的訪問權限等。
  • 線性地址的高10位用來在一個擁有2^10 = 1024個條目的頁目錄中查詢目標項,頁目錄的的每一項存放的是頁表地址,頁目錄的存放單位也是頁,一個頁面如果作爲頁目錄,其每個條目的長度是4K/1024 = 4Byte = 32bit。頁目錄項PDE(Page Directory Entry)的格式如下:
    在這裏插入圖片描述
  • 同PTE類似,PDE由於存放的也是4K對齊的頁地址,因此其低12位始終爲0,同樣可以被複用,PDE的低12位用來存放描述一張頁表覆蓋的地址空間的元數據。由於PTE描述的是4K頁面,一張頁表1024個PTE,因此PDE描述1024個4K頁面,PDE描述了4MB的物理地址空間。

CR3

  • 32-bit分頁模式下CR3存放的頁目錄表物理地址,格式如下:
    在這裏插入圖片描述

PAE模式

  • PAE(Physical Adress Extend)即物理地址擴展。顧名思義,它是對物理地址的擴展,擴展什麼呢?擴展32-bit模式下只能尋址4G內存空間的限制,它可以將32位的線性地址轉化位最高52位的物理地址,可以尋址大於4G的地址空間。怎麼做到的?PAE分頁模式的頁表結構變了,頁表項長度增加變成了8字節(64bit)。
  • PAE模式的開啓需要CR0.PG和CR4.PAE兩個標誌位同時打開。

層級結構

  • PAE分頁模式下存放頁目錄物理地址的寄存器不再是CR3,而是該模式下特有4個PDPTE寄存器,4個寄存器從PDPT(page-directory-pointer table)中加載值,該表的物理地址存放到了CR3中。在PAE模式下,只要CR3的值有改變,就會同步更新4個PDPTE寄存器,當發生地址轉換時CPU可以直接從PDPTE寄存其中讀取頁目錄的物理地址,4個PDPTE寄存器在地址轉換中起到的作用和32-bit模式下CR3的作用相同。
    在這裏插入圖片描述
    對比32-bit分頁模式,PAE分頁模式多了一級索引,物理地址轉換過程變爲CR3 -> PDPTE -> PDE -> PTE -> Page Physical Address。這裏要注意,CR3 -> PDPTE的過程並非發生在地址轉換流程中,而是在CR3寄存器變化的時候。所以從地址轉換效率上說,32-bit模式和PAE模式都只有三次查詢動作,效率接近。PAE模式通過多維護4個PDPTE寄存器實現了物理地址的擴展。

PTE/PDE

  • PAE模式頁大小我們也分析4K的情況,同32-bit模式一樣,通過低12位可以從一個頁面內找到任意地址的內存。因此線性低12位用作查找頁面內的偏移。
  • 線性地址的12 ~ 20位,這9位用來在頁表中索引目標頁表項,9位地址可以索引2 ^ 9 = 512個條目,如果一張頁表只存放512個條目,那麼每個條目的長度爲 2 ^ 12 / 2 ^ 9 = 2 ^ 3 = 8byte = 64bit。有足夠的寬度來存放物理地址,而32-bit模式下,最多隻有32bit來存放物理地址,這是PAE能夠擴展物理地址尋址能力的關鍵。PTE格式如下:
    在這裏插入圖片描述
    PTE的低12位仍然用於描述內存頁的元數據,剩下的52bit中除最高位以外,其餘可以全部用作存放頁的物理地址。因此PTE模式下的頁表,理論上可以存放51bit的物理地址。Intel在具體實現上,頁表中頁的物理地址取決於最大物理地址位寬MAXPHYADDR,該值是cpu所支持的最大地址寬度。很明顯32-bit分頁模式下,MAXPHYADDR爲32,PAE分頁模式下通常可以配置的值爲36,40,52這三個,PTE中存放頁面物理地址的區間可以表示爲12 ~ MAXPHYADDR
  • 線性地址的21 ~ 29位,這9位用來在頁目錄表中索引目標頁目錄表項,9位地址可以索引 2 ^ 9 = 512個條目,同PTE類似,PDE存放的是PTE的物理地址,這個物理地址也是4K對齊,存放頁表物理地址的區間可以表示爲12 ~ MAXPHYADDR,PDE格式如下:
    在這裏插入圖片描述

PDPTE

  • PAE模式下線性地址的最高兩位用於索引4個PDPTE寄存器,每個PDPTE(page-directory-pointer table entry)寄存器都存放了一個頁目錄表的地址,指向一張頁目錄表。PDPTE寄存器的初始值來自於頁目錄指針表(page-directory-pointer table),在PAE模式開啓之前,用戶軟件就需要在內存中準備這樣一張表,然後將其地址取出,存放到CR3寄存器中。存放的MOV指令會觸發加載動作,將內存中表的內容加載到寄存器中。這樣PDPTE寄存器就替代了CR3的作用,CPU每次進行地址轉換時,不再通過CR3尋找頁目錄表的地址,而是通過PDPTE寄存器尋找地址。而PDPTE有4個,用哪個呢?它的索引就是線性地址的最高兩位。PDPTE格式如下:
    在這裏插入圖片描述
    PDPTE的格式和PDE/PTE的格式類似,低12位都用於存放描述內存區域的元數據,12 ~ MAXPHYADDR用於存放頁目錄表的物理地址。

CR3

  • PAE模式下CR3存放的不再是頁目錄表的物理地址,而是頁目錄指針表的物理地址,格式如下:
    在這裏插入圖片描述
    由於PDPT包含4個PDPTE,所以總長度是4 * 8 = 32字節,PDPT的物理地址32字節對齊,低5位始終爲0。CR3寄存器的低5位可以複用,但這裏暫時沒有定義,因此忽略低5位。除去低5位,CR3的剩餘27用於存放頁目錄指針表的物理地址。

4-level模式

  • 4-level模式,顧名思義,地址轉換需要通過4級層層索引才能實現。4-level與32-bit和PAE相比,最大的不同就是它在地址轉換時多了一級,32-bit和PAE可以看做是2-level的地址轉換(因爲內存裏面存放了兩張表)。4-level將48位線性地址轉化成52位物理地址,因此4-level分頁模式必須在64位cpu上才能支持。
  • 4-level分頁模式多出的一級索引叫做PML4(Page Map Level 4),它存放的是頁目錄指針表的地址,4-level模式下的地址轉換過程CR3 -> PML4E -> PDPTE -> PDE -> PTE
  • 4-level模式開啓需要CR0.PG,CR4.PAE和IA32_EFER.LME三個標誌位同時打開。

層級結構

  • 4-level分頁模式增加了PML4結構,層級結構如下:
    在這裏插入圖片描述

PTE/PDE

  • 4-level模式下的線性地址,頁面大小仍然以4K爲例,低12位用作一個物理頁面的內部地址索引,線性地址餘下的部分被分成了4部分,每個部分都佔用9位,用做對應表的索引,可以計算出,每個部分對應的表條目都是2 ^ 9 = 512個,如果頁面是4K,那麼每個條目的長度爲2 ^ 12 / 2 ^ 9 = 2 ^ 3 = 8字節,每個條目都是64bit。
  • 線性地址中用來索引PTE/PDE的域都是9位,格式如下:
    在這裏插入圖片描述

PDPTE

  • 4-level分頁模式下,頁目錄指針表被存放到了內存中,其內容並沒有加載到4個寄存器上,這一點和PAE模式不同,線性地址中同樣用9位來索引PDPTE,其格式如下:
    在這裏插入圖片描述

PML4E

  • PML4E(page map level 4 entry)是4-level下新設計的索引表的條目,線性地址的高9位用於索引PML4E,格式如下:
    在這裏插入圖片描述

CR3

  • 4-level分頁模式下CR3存放的是PML4表的物理地址:
    在這裏插入圖片描述

總結

  • 32-bit分頁模式和PAE分頁模式的線性地址都爲32位,4-level分頁模式的線性地址爲64位,但只用了其中的48位。32-bit分頁模式下內存中存放的地址轉換表有兩張,1張是頁目錄表,1張是頁表;PAE分頁模式下內存中存放的地址轉換表雖然有3張(Page Directory Pointer Table,Page Directory Table,Page Table),但Page Directory Pointer Table的值會被加載到寄存器中,因此地址轉換時也只用了兩張表;4-level分頁模式下有4張表用於地址轉換,分別是PML4 Table,Page Directory Pointer Table,Page Directory,Page Table。
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章