一步步编写操作系统 38 一级页表与虚拟地址3
接上,頁是地址空間的計量單位,并不是專屬物理地址或線性地址,只要是4KB的地址空間都可以稱為一頁,所以線性地址的一頁也要對應物理地址的一頁。一頁大小為4KB,這樣一來,4GB地址空間被劃分成4GB/4KB=1M個頁,也就是4GB空間中可以容納1048576個頁,頁表中自然也要有1048576個頁表項,這就是我們要說的一級頁表。一級頁表如圖:
這是一級頁表模型,由于頁大小是4KB,所以頁表項中的物理地址都是4k的整數倍,故用16進制表示的地址,低3位都是0。就拿第3個頁表項來說,其值為0x3000,表示該頁對應的物理地址是0x3000。
可能,您心里一直有個疑問:頁表如何使用呢?也就是如何將線性地址轉換成物理地址呢?
還是用圖5-10幫助理解,滑塊正落到在32位地址的第12位。右邊11~0位用來表示頁的大小,也就是這12位可以做為頁內尋址。左邊31~12位用來表示頁的數量,同樣這20位也用來索引一個頁(索引范圍0~0xfffff),表示第幾個頁,對吧。
其實也可以這樣理解:任意一個地址最終會落到某一個物理頁中。32位地址空間共有1M(1048756)個物理頁,首先要做的是定位到某個具體物理頁,然后給出物理頁內的偏移量就可以訪問到任意1字節的內存啦。所以,用20位二進制就可以表示全部物理頁啦。標準頁都是4KB,12位二進制便可以表達4KB之內的任意地址。
在32位保護模式下任何地址都是用32位二進制表示,包括虛擬地址也是。經以上分析,虛擬地址的高20位可用來定位一個物理頁,低12位可用來在該物理頁內尋址。這是如何實現的呢?物理地址是寫在頁表的頁表項中,段部件輸出的只是線性地址,所以問題就變成了:怎樣用線性地址找到頁表中對應的頁表項。
在此之前,大家要知道兩件事:
剛才說過啦,如何通過線性地址找到其對應的頁表項才是轉換的關鍵。既然頁表是位于內存中,所以只要提供頁表項的物理地址便能夠訪問到頁表項。頁表本身屬于線性表結構,相當于頁表項數組,訪問其中任意頁表項成員,只要知道該表頁項的索引(下標)就夠了。
分析過后,地址轉換過程原理如下:
一個頁表項對應一個頁,所以,用線性地址的高20位做為頁表項的索引,每個頁表項要占用4字節大小,所以這高20位的索引乘以4后才是該頁表項相對于頁表物理地址的字節偏移量。用cr3寄存器中的頁表物理地址加上此偏移量便是該頁表項的物理地址,從該頁表項中得到映射的物理頁地址,然后用線性地址的低12位與該物理頁地址相加,所得的地址之和便是最終要訪問的物理地址。
曾經有同學對地址轉換過程感到迷惑,誤以為啟用分頁后,頁表項地址也是虛擬地址,還需要被轉換,轉換過程無限遞歸下去,這顯然是不對的。
以上所說的轉換步驟多少都有點麻煩,既然地址轉換算法已經是固定的了,何不使其在硬件一級自動完成呢。有道理,所以cpu中集成了專門用來干這項工作的硬件模塊,我們把該模塊稱為頁部件。當程序中給出一個線性地址時,頁部件分析線性地址,按照以上算法,自動在頁表中檢索到物理地址。
總結一下頁部件的工作:用線性地址的高20位在頁表中索引頁表項,用線性地址的低12位與頁表項中的物理地址相加,所求的和便是最終線性地址對應的物理地址。
咱們還是通過例子來理解轉換過程吧。拿mov ax,[0x1234]來說,其地址轉換完整過程如圖:
假設咱們是在平坦模型下工作,不管段選擇子值是多少,其所指向的段基址都是0,指令mov ax,[0x1234]中的0x1234稱為有效地址,它做為“段基址:段內偏移地址”中的段內偏移地址。這樣段基址為0,段內偏移地址為0x1234,經過段部件處理后,輸出的線性地址是0x1234。由于咱們是演示分頁機制,必須假定系統已經打開了分頁機制,所以線性地址0x1234被送入了頁部件。頁部件分析0x1234的高20位,用16進制表示高20位是0x00001。將此項做為頁表項索引,再將該索引乘以4后加上cr3寄存器中頁表的物理地址,這樣便得到索引所指代的頁表項的物理地址,從該物理地址處(頁表項中)讀取所映射的物理頁地址:0x9000。線性地址的低12位是0x234,它做為物理頁的頁內偏移地址與物理頁地址0x9000相加,和為0x9234,這就是線性地址0x1234最終轉換成的物理地址。
一級頁表說了這么多,完全是為了講述頁表原理,這樣就能更好的理解下面要講的二級頁表,它們在原理上一脈相承。因為目前現代操作系統一般都是用二級頁表,咱們的系統也采用二級頁表,下一節咱們再見啦。
總結
以上是生活随笔為你收集整理的一步步编写操作系统 38 一级页表与虚拟地址3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最近金价大涨创历史新高,还能买吗?有银行
- 下一篇: 一步步编写操作系统 69 汇编语言和c语