在之前的文章中,我們介紹過 GDT(全局描述符表)以及一致代碼段和非一致代碼段,這篇文章我們再回到描述符,這次我們來以 ARM 架構爲例瞭解一下頁表描述符。
在這篇文章中,我們會看到以下內容:
頁表是什麼?
一級頁表的地址變換過程
由一級描述符來獲取二級描述符或者段地址的過程
頁表
頁表是什麼?
頁表是一種特殊的數據結構,放在系統空間的頁表區,存放邏輯頁與物理頁幀的對應關係。 每一個進程都擁有一個自己的頁表,PCB表中有指針指向頁表。
(來自百度百科)
通俗的來講,頁表的內容就是一個描述符(關於描述符的介紹請參看該系列文章中的《實現一個 GDT》),我們可以將 GDT 理解成爲一個一級描述符表,將 LDT 理解爲一個二級描述符表。這篇文章我將以 ARM 體系結構爲例,介紹一級頁表的地址變換過程以及根據一級頁表的類型來獲取二級描述符表或者段的物理地址。
MMU 中的地址變換
ARM 系統中的虛擬空間到物理存儲空間的映射是以內存塊爲單位進行的,即虛擬內存中的一塊連續的空間被映射到物理存儲空間一段連續的地址空間。
ARM 支持以下幾種大小的存儲塊:
- 段(Section):大小爲1MB
- 大頁(Large Pages):大小爲64KB
- 小頁(Small Pages):大小爲4KB
- 微頁(Tiny Pages):大小爲1KB
在頁表中,每一個地址變換條目實際上記錄了一個虛擬空間的存儲塊的基地址與物理空間存儲塊的對應關係,根據存儲塊的大小,會有多種不同的地址變換。
在 ARM 中,MMU 實現虛擬地址到物理地址的映射是通過兩級頁表來實現的(以段爲單位的地址變換是通過一級頁表實現的)
ARM 中與 MMU操作相關的寄存器
寄存器 | 作用 |
---|---|
C1 | 配置 MMU 中的一些操作 |
C2 | 保存頁表的基地址 |
C3 | 設置域的訪問控制屬性 |
C4 | 保留 |
C5 | 內存訪問失效狀態指示 |
C6 | 內存訪問失效時失效的地址 |
C8 | 控制與清除 TLB 內容相關操作 |
C10 | 控制與鎖定 TLB 內容相關操作 |
一級頁表
如何獲得一級頁表的地址?
從上表中我們可以看到 C2中保存了頁表的基地址,由此,我們可以看到下圖:
一級頁表地址 = C2寄存器的高18位 + 虛擬地址的高22位 + 00 (共32位)
一級描述符
我們得到了一級頁表的地址,對應地址空間的內容就是一級描述符。
一級描述符分爲以下類型:
- 粗粒度頁表描述符
- 段描述符
- 細粒度頁表描述符
從以上三幅圖中我們可以看到,不同類型的描述符是由描述符的最低2位決定的,分別爲:
類型 | 低1位 | 低0位 |
---|---|---|
粗粒度頁表描述符 | 0 | 1 |
段描述符 | 1 | 0 |
細粒度頁表描述符 | 1 | 1 |
無效 | 0 | 0 |
獲得二級描述符表或者段地址過程
由粗粒度頁表描述符獲得二級描述符表
從圖中我們可以清楚的看到由粗粒度描述符表得到二級描述符表地址的過程:
二級描述符表地址 = 粗粒度描述符表高22位 + 虛擬地址[19:12]位 + 00 (共32位)
由細粒度頁表描述符獲得二級描述符表
從圖中我們可以清楚的看到由細粒度描述符表得到二級描述符表地址的過程:
二級描述符表地址 = 粗粒度描述符表高20位 + 虛擬地址[19:10]位 + 00 (共32位)
由段描述符表描述符獲得段的物理地址
從圖中我們可以清楚的看到由段描述符表描述符獲得段的物理地址的過程:
段物理地址 = 段描述符高12位 + 虛擬地址低20位
總結
在這篇文章中,我們加深了之前對描述符的理解,同時對描述符的作用做了更直接的解釋,對於頁表也進行了介紹。這篇文章中我們以 ARM 體系結構爲例講解了二級頁表的工作,其實,按照同樣的道理我們也可以設計出三級頁表以及更多級的頁表。
本文的版權歸作者 羅遠航 所有,採用 Attribution-NonCommercial 3.0 License。任何人可以進行轉載、分享,但不可在未經允許的情況下用於商業用途;轉載請註明出處。感謝配合!