MIT-JOS系列:用戶態訪問頁表項詳解

在MIT-JOS lab4的實驗中,爲了可以在用戶態自定義處理頁面錯誤,咱們必需要知道操做的頁面的屬性(是否當前用戶具備讀寫權限、是否copy on write頁面),這就須要查詢指向當前物理頁面的頁表項和目錄表項獲取它的屬性app

在以前的實驗中,咱們已經經過e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_P | PTE_U;修改UVPT的目錄表項,用此操做容許用戶讀取任一頁面的頁表項,但沒有對其進行詳細解釋,所以在lab4的應用中遇到了一些障礙:不知道具體是怎麼用UVPT定位到一個頁面對應的頁表項。在這裏,將對這個進行詳細解釋佈局

定義梳理

解釋原理前,首先列出各變量和宏的定義,以幫助說明和理解:spa

  • uvptpte_t uvpt[] = UVPT;
  • uvpdpde_t uvpd[] = UVPT+(UVPT>>12)*4;

對線性地址la的分解以下:code

// A linear address 'la' has a three-part structure as follows:
//
// +--------10------+-------10-------+---------12----------+
// | Page Directory |   Page Table   | Offset within Page  |
// |      Index     |      Index     |                     |
// +----------------+----------------+---------------------+
//  \--- PDX(la) --/ \--- PTX(la) --/ \---- PGOFF(la) ----/
//  \---------- PGNUM(la) ----------/

PGNUM(la)獲取的是虛擬地址la是第幾個虛擬頁面blog

UVPT處的內存佈局以下:索引

/*                     :              .               :                   
 *                     :              .               :                   
 *    MMIOLIM ------>  +------------------------------+ 0xefc00000
 *                     |       Memory-mapped I/O      | RW/--  PTSIZE
 * ULIM, MMIOBASE -->  +------------------------------+ 0xef800000
 *                     |  Cur. Page Table (User R-)   | R-/R-  PTSIZE
 *    UVPT      ---->  +------------------------------+ 0xef400000
 *                     |          RO PAGES            | R-/R-  PTSIZE
 *    UPAGES    ---->  +------------------------------+ 0xef000000
 *                     |           RO ENVS            | R-/R-  PTSIZE
 * UTOP,UENVS ------>  +------------------------------+ 0xeec00000
 *                     :              .               :                   
 *                     :              .               :                   
 */

UVPT佔總共PTSIZE的物理內存,每個頁表項4個字節,總共有1024×1024個頁表項,這一段足夠索引到全部頁表項。該段地址以只讀權限開放給用戶態的程序three

虛擬地址與頁表的對應關係

首先要明確一點,雖然一個虛擬頁面映射到哪一個物理頁面是隨系統分配的,但虛擬頁面在頁表中的結構老是固定的,例如第0個虛擬頁面地址老是0-FFF,它老是對應頁表目錄的第0項和第0個二級頁表的第0項。內存

頁表目錄、二級頁表和各虛擬頁面對應關係如圖it

1555577191762

頁表目錄中:class

第0個頁表項指向第0個二級頁表,第0個二級頁表映射第0-1023個虛擬頁面,每個條目記載該虛擬頁面映射的物理頁面的地址。關聯第0個二級頁表的全部虛擬地址la,其PDX(la)必爲0,PDX(la)爲0-FFF

第1個頁表項指向第1個二級頁表,第1個二級頁表映射第1024-2047個虛擬頁面。關聯第1個二級頁表的全部虛擬地址la,其PDX(la)必爲1,PDX(la)爲0-FFF

......

二級頁表項訪問

以訪問uvpt[0]舉例,假設當前頁表目錄爲pgdir

uvpt[0]的虛擬地址爲0xef400000,二進制爲1110111101 0000000000 000000000000,其中第一部分是pdx=1110111101,第二部分是ptx=0,第三部分是pgoff=0

當訪問uvpt[0]時:

  1. 取出虛擬地址的PDX,查找頁表目錄的第pdx項,其值爲pgdir[PDX(UVPT)],指向當前頁表目錄所在的頁面,所以找到的二級目錄是頁表目錄
  2. 取出PTX,查找頁表目錄的第ptx項(第0項),獲得第0個二級目錄所在的頁面
  3. 取出PGOFF,查找頁面的第pgoff項(第0項),獲得第0個二級目錄的第0項,其值是一個頁表項,對應第0個頁面

能夠看出若訪問uvpt[n],若將其虛擬地址拆分爲pdx, ptx, pgoff, 則能獲得虛擬頁面編號N=n=ptx*1024+pgoff=(ptx<<12)+pgoff,所以訪問uvpt[n]的值能獲得第n個虛擬頁面的頁表項

頁表目錄項訪問

頁表目錄項訪問的過程與二級頁表項訪問相似

以訪問uvpd[0]舉例,假設當前頁表目錄爲pgdir

uvpd[0]的虛擬地址爲UVPT+(UVPT>>12)*4,同上拆成三部分,其中第一部分是pdx=1110111101,第二部分是ptx=(UVPT>>12)*4>>12,第三部分是pgoff=0

當訪問uvpd[0]時:

  1. 取出虛擬地址的PDX,查找頁表目錄的第pdx項,其值爲pgdir[PDX(UVPT)],指向當前頁表目錄所在的頁面,所以找到的二級目錄是頁表目錄
  2. 取出PTX,查找頁表目錄的第ptx項(第(UVPT>>12)*4>>12項),這個表項仍是指向頁表目錄所在的頁面
  3. 取出PGOFF,查找頁表目錄的的第pgoff個表項(第0項)

以此類推,uvpd[n](0<=n<1024)就是頁表目錄的第n個表項

與訪問uvpt[n]相比,其實就是第2個步驟迴繞了一下,致使三步查詢獲得的是目錄的表項

與一般的尋址方式類比

一般尋址:

cr3            PDX             PTX            PGOFF  
------->頁表目錄---------二級頁表-------->物理頁面-------->值

uvpt[n]

cr3            PDX             PTX            PGOFF  
------->頁表目錄---------頁表目錄-------->二級頁表-------->二級頁表項

uvpd[n]

cr3            PDX             PTX            PGOFF  
------->頁表目錄---------頁表目錄-------->頁表目錄-------->目錄表項
相關文章
相關標籤/搜索