在之前的文章中,我們介紹過 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中儲存了頁表的基位址,由此,我們可以看到下圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuQjM5IDN4MWNjVGM4cTM0UTMlFWZ4gjZycjN4UmNjJjMvwFbh5Wanlmcv9CXt92YuAHchFmbpNnLy9Gdz5yZtlWLjlGcolHbvw1LcpDc0RHaiojIsJye.png)
一級頁表位址 = C2寄存器的高18位 + 虛拟位址的高22位 + 00 (共32位)
一級描述符
我們得到了一級頁表的位址,對應位址空間的内容就是一級描述符。
一級描述符分為以下類型:
- 粗粒度頁表描述符
- 段描述符
- 細粒度頁表描述符
從以上三幅圖中我們可以看到,不同類型的描述符是由描述符的最低2位決定的,分别為:
類型 | 低1位 | 低0位 |
---|---|---|
粗粒度頁表描述符 | 1 | |
段描述符 | 1 | |
細粒度頁表描述符 | 1 | 1 |
無效 |
獲得二級描述符表或者段位址過程
由粗粒度頁表描述符獲得二級描述符表
從圖中我們可以清楚的看到由粗粒度描述符表得到二級描述符表位址的過程:
二級描述符表位址 = 粗粒度描述符表高22位 + 虛拟位址[19:12]位 + 00 (共32位)
由細粒度頁表描述符獲得二級描述符表
從圖中我們可以清楚的看到由細粒度描述符表得到二級描述符表位址的過程:
二級描述符表位址 = 粗粒度描述符表高20位 + 虛拟位址[19:10]位 + 00 (共32位)
由段描述符表描述符獲得段的實體位址
從圖中我們可以清楚的看到由段描述符表描述符獲得段的實體位址的過程:
段實體位址 = 段描述符高12位 + 虛拟位址低20位
總結
在這篇文章中,我們加深了之前對描述符的了解,同時對描述符的作用做了更直接的解釋,對于頁表也進行了介紹。這篇文章中我們以 ARM 體系結構為例講解了二級頁表的工作,其實,按照同樣的道理我們也可以設計出三級頁表以及更多級的頁表。
本文的版權歸作者 羅遠航 所有,采用 Attribution-NonCommercial 3.0 License。任何人可以進行轉載、分享,但不可在未經允許的情況下用于商業用途;轉載請注明出處。感謝配合!