目錄
一、分頁機制介紹
1. 什么是分頁機制
分頁機制是 80x86 內存管理機制的第二部分。它在分段機制的基礎上完成虛擬地址到物理地址的轉換過程。分段機制把邏輯地址轉換成線性地址,而分頁機制則把線性地址轉換成物理地址。分頁機制可用於任何一種分段模型。處理器分頁機制會把線性地址空間划分成頁面,然后這些線性地址空間頁面被映射到物理地址空間的頁面上。分頁機制的幾種頁面級保護措施,可和分段機制保護措施和用或替代分段機制的保護措施。
2.分頁機制如何啟用
通過設置控制寄存器 CR0 的 PG 為可以啟用分頁機制。如果 PG=1,則啟用分頁操作,處理器會使用分頁機制將線性地址轉換成物理地址。如果 PG=0,則禁用分頁機制,此時分段機制產生的線性地址直接用作物理地址。
與分段機制不同,分頁機制對固定大小的內存塊(稱為頁面)進行操作。分頁機制把線性地址空間和物理地址空間都划分成頁面。線性地址空間中的任何頁面可以被映射到物理地址空間的任何頁面上。如下圖所示。
3.分頁機制線性地址到物理地址轉換過程
80x86使用 4K 字節固定大小的頁面,每個頁面均是 4KB,並且對其於 4K 地址邊界處。 這表示分頁機制把 2^32字節(4GB)的線性地址空間划分成 2^20(1M = 1048576)個頁面。分頁機制通過把線性地址空間中的頁面重新定位到物理地址空間中進行操作。由於 4K 大小的頁面作為一個單元進行映射,並且對其於 4K 邊界,因此線性地址的低 12 位可做為頁內偏移地量直接作為物理地址的低 12 位。分頁機制執行的重定向功能可以看作是把線性地址的高 20 位轉換到對應物理地址的高 20 位。
線性到物理地址轉換功能,被擴展成允許一個線性地址被標注為無效的,而非要讓其產生一個物理地址。以下兩種情況一個頁面可以被標注為無效的:
1. 操作系統不支持的線性地址。
2. 對應的虛擬內存系統中的頁面在磁盤上而非在物理內存中。
在第一中情況下,產生無效地址的程序必須被終止,在第二種情況下,該無效地址實際上是請求 操作系統虛擬內存管理器 把對應的頁面從磁盤加載到物理內存中,以供程序訪問。因為無效頁面通常與虛擬存儲系統相關,因此它們被稱為不存在頁面,由頁表中稱為存在的屬性來確定。
當使用分頁時,處理器會把線性地址空間划分成固定大小的頁面(4KB),這些頁面可以映射到物理內存中或磁盤存儲空間中,當一個程序引用內存中的邏輯地址時,處理器會把該邏輯地址轉換成一個線性地址,然后使用分頁機制把該線性地址轉換成對應的物理地址。
如果包含線性地址的頁面不在當前物理內存中,處理器就會產生一個頁錯誤異常。頁錯誤異常處理程序就會讓操作系統從磁盤中把相應頁面加載到物理內存中(操作過程中可能會把物理內存中不同的頁面寫到磁盤上)。當頁面加載到物理內存之后,從異常處理過程的返回操作會使異常的指令被重新執行。 處理器把用於線性地址轉換成物理地址和用於產生頁錯誤的信息包含在存儲與內存中的頁目錄與頁表中。
分頁機制與分段機制的不同
分頁與分段的最大的不同之處在於分頁使用了固定長度的頁面。段的長度通常與存放在其中的代碼或數據結構有相同的長度。 與段不同,頁面有固定的長度。如果僅使用分段地址轉換,那么存儲在物理內存中的一個數據結構將包含其所有的部分。如果使用了分頁,那么一個數據結構就可以一部分存儲與物理內存中,而另一部分保存在磁盤中。
為了減少地址轉換所要求的總線周期數量,最近訪問的頁目錄和頁表會被存放在處理器的一個叫做轉換查找緩沖區(TLB)的緩沖器件中。 TLB 可以滿足大多數讀頁目錄和頁表的請求而無需使用總線周期。 只有當 TLB 中不包含所要求的頁表項是才會出現使用額外的總線周期從內存讀取頁表項。通常在一個頁表項很長時間沒有訪問過時才會出現這種情況。
二、頁表結構
分頁轉換功能由駐留在內存中的表來描述,該表稱為頁表,存放在物理地址空間中。 頁表可以看作是簡單的 2^20 物理地址數組。 線性到物理地址的映射功能可以簡單地看作進行數組查找。 線性地址的高 20 位構成這個數組的索引值,用於選擇對應頁面的物理(基)地址。線性地址的低 12 位給出了頁面中的偏移量,加上頁面的基地址最終形成對應的物理地址。 由於頁面基地址對齊在 4K 邊界上,因此頁面基地址的低 12 為肯定是 0 ,這意味着 高 20 位的頁面基地址 和 12 位偏移地址連接組合在一起就能得到對應的物理地址。
頁表中每個頁表項 大小為 32 位,由於只需其中的 20 位來存放頁面的物理基地址,因此剩下的 12 位可用於存放諸如頁面是否存在等的屬性信息。如果線性地址索引的頁表被標注為存在,則表示該項有效, 我們可以從中取得頁面的物理地址。 如果項中表明不存在,那么當當訪問對應物理界面時就會產生一個異常。
一、兩級頁表結構
頁表含有 2^20 個表項,而每項占用 4 個字節。如果作為一個表來存放,最多將占用 4M 的內存。 為了減少內存占用量,80x86 使用了兩級頁表。 高 20 位線性地址到物理地址的轉換被分成兩步來進行,每次轉換其中 10 位。
第一級表稱為頁目錄,存放在一頁 4K 大小的頁面中,具有 2^10 個 4 字節長度的表項。 這些表象指向對應的二級表。 線性地址的最高 10 位(31-22)用作以及表中的索引。
第二級稱為頁表,長度也是 4K 大小的一個頁面,最多有 1K 個 4 字節的表項。 每個 4 字節的表項含有相關頁面的 20 位物理基地址。 二級頁表使用線性地址的中間 10 位(21-12)作為表項索引值,以獲取含有頁面 20 物理地址基地址的表項。 該20位頁面物理基地址和線性地址中的低12位(頁內偏移)組合在一起就得到了分頁轉換過程的輸出值,即對應的的最終物理地址。
二級頁表的查找過程。其中 CR3 寄存器指定頁目錄表的基地址。線性地址的高10位用於索引這個頁目錄表,以獲得指向相關第二級頁表的指針。線性地址空間中間10位用於索引二級頁表,以獲得物理地址的高20位。線性地址的低12位直接作為物理地址的低12位,從而組成一個完整的32位物理地址。
二、不存在的頁表
二級頁表結構允許頁表被分散在內存各個頁面中,而不需要保存在連續的 4MB 內存塊中。另外,並不需要為不存在的 或 線性地址空間未使用部分分配二級頁表。 雖然目錄表頁面必須常駐內存中,但是二級頁表可以在需要時再分配。這使得頁表結構的大小對應於實際使用的線性地址空間大小。
頁目錄表中每個表項也有一個存在屬性,類似於頁表中的表項。頁目錄表項中的存在屬性指明對應的二級頁表是否存在。如果目錄表指定的二級頁表存在,那么通過訪問二級表,表查找過程第二步將正常進行。如果存在位表明對應的二級表不存在,那么處理器就會產生一個異常來通知操作系統。頁目錄表項中的存在屬性使得操作系統可以根據實際使用的線性地址范圍來分配二級頁表頁面。
目錄表項中的存在位還可用於在虛擬內存中存放二級頁表。這意味着在任何時候只有部分二級頁表需要存放在物理內存中,而其余的可保存在磁盤上。處於物理內存中頁表對應的頁目錄項將被標注為存在,以表明可用它們進行分頁轉換。處於磁盤上的頁表對應的頁目錄項將被標注為不存在。由於二級頁表不存在而引發的異常會通知操作系統把缺少的頁表從磁盤上加載進物理內存。把頁表存儲在虛擬內存中減少了保存分頁轉換所需要的物理內存量。
三、 頁表項格式
頁目錄和頁表的表項格式如下圖所示,其中位32-12含有物理地址的高20位,用於定位物理地址空間中一個頁面(也叫頁幀)的物理基地址。表項的低 12 位含有頁屬性信息。
-
P 位0是存在標志,用於指明表項對地址轉換是否有效。 P=1 表示有效;P=0 表示無效。在頁轉換過程中,如果涉及的 頁目錄或頁表的表項無效,則會導致一個異常。 如果 P=0,那么除表示表項無效外,其余位可供程序自由使用,如圖中 b 所示
-
R/W 位1是讀/寫標志。如果等於1,表示頁面可以被讀、寫或執行。如果為0,表示頁面只讀或可執行。當處理運行在超級用戶特權級(級別0、1或2)時,則R/W位不起作用。頁目錄項中的R/W位對其所映射的所有頁面起作用。
-
U/S 位2是用戶/超級用戶標志。如果為1,那么運行在任何特權級的程序都可以訪問該頁面,如果是0,那么頁面只能被允許在超級特權級上的程序訪問。頁目錄項中的U/S位對其所映射的所有頁面起作用。
-
A 位5是已訪問標志。當處理器訪問頁表項映射的頁面時,頁表項的這個標志就會被置為1.當處理器訪問頁目錄表項映射的任何頁面時,頁表目錄項的這個標志就會被置為1。處理器只負責設置該標志位,操作系統可通過定期地復位該標志來統計頁面的使用情況。
-
D 位6是頁面已被修改標志。當處理器對一個頁面執行寫操作時,就會設置對應頁表表項的D標志。處理器並不會修改頁目錄項中的D標志。
-
AVL 該字段保留專供程序使用。處理器不會修改這幾位,以后的升級處理器也不會。
虛擬存儲
也目錄和頁表表項中的存在標志 P 為使用分頁技術的虛擬存儲提供了必要的支持。若線性地址空間中的頁面存在於物理內存中,則對應表項中的標志 P=1,並且該表項中含有相應的物理地址。頁面不在物理內存中的表項其標志 P=0。 如果程序訪問物理內存中不存在的頁面,處理器就會產生一個缺頁異常。此時操作系統就可以利用這個異常處理過程把缺少的頁面從磁盤上調入物理內存中,並把相應物理地址存放在表項中,最后在返回程序重新執行引起異常的指令之前設置標志 P=1。
已訪問標志 A 和已修改標志 D 可以用於有效地實現虛擬存儲技術。通過周期性地檢查和復位所有 A 標志,操作系統能夠確定哪些頁面最近沒有訪問過,這些頁面可以成為移出到磁盤上的候選者。假設當一頁面從磁盤上讀入內存時,其臟標志 D=0,那么當頁面再次被移出到磁盤上時,若 D標志還是0,則該頁面就無需被寫入磁盤中(因為沒有被改)。若此時 D=1,則說明頁面已經被修改過,於是就必須將該頁面寫到磁盤上。