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