一步步编写操作系统 39 二级页表1
前面講述了頁(yè)表的原理,并以一級(jí)頁(yè)表做為原型講述了地址轉(zhuǎn)換過(guò)程。既然有了一級(jí)頁(yè)表,為什么還要搞個(gè)二級(jí)頁(yè)表呢?理由如下:
歸根結(jié)底,我們要解決的是:不要一次性地將全部頁(yè)表項(xiàng)建好,需要時(shí)動(dòng)態(tài)創(chuàng)建頁(yè)表項(xiàng)。如何解決呢?
二級(jí)頁(yè)表很好的解決了該問(wèn)題。我們來(lái)說(shuō)下,什么是二級(jí)頁(yè)表。
無(wú)論是幾級(jí)頁(yè)表,標(biāo)準(zhǔn)頁(yè)的尺寸都是4KB,這一點(diǎn)是不變的。所以4GB線性地址空間最多有1M個(gè)標(biāo)準(zhǔn)頁(yè)。一級(jí)頁(yè)表是將這1M個(gè)標(biāo)準(zhǔn)頁(yè)放置到一張頁(yè)表中,二級(jí)頁(yè)表是將這1M個(gè)標(biāo)準(zhǔn)頁(yè)平均放置1K個(gè)頁(yè)表中。每個(gè)頁(yè)表中包含有1K個(gè)頁(yè)表項(xiàng)。頁(yè)表項(xiàng)是4字節(jié)大小,頁(yè)表包含1K個(gè)頁(yè)表項(xiàng),故頁(yè)表大小為4KB,這恰恰是一個(gè)標(biāo)準(zhǔn)頁(yè)的大小。
拆分出了這么多個(gè)頁(yè)表,如何使用它們呢?為此,專(zhuān)門(mén)有個(gè)頁(yè)目錄表來(lái)存儲(chǔ)這些頁(yè)表。每個(gè)頁(yè)表的物理地址在頁(yè)目錄表中都以頁(yè)目錄項(xiàng)PDE(Page Directory Entry)的形式存儲(chǔ),頁(yè)目錄項(xiàng)大小同頁(yè)表項(xiàng)一樣,都是用來(lái)描述一個(gè)物理頁(yè)的物理地址,其大小都是4字節(jié),而且最多有1024個(gè)頁(yè)表,所以頁(yè)目錄表也是4KB大小,同樣也是標(biāo)準(zhǔn)頁(yè)的大小。
頁(yè)表是用于管理內(nèi)存的數(shù)據(jù)結(jié)構(gòu),其也要占用內(nèi)存,所以頁(yè)目錄表和頁(yè)表所占用的物理頁(yè),同樣是混跡于物理內(nèi)存之中,如圖
頁(yè)目錄表中共1024個(gè)頁(yè)表,也就是有1024個(gè)頁(yè)目錄項(xiàng)。一個(gè)頁(yè)目錄項(xiàng)中記錄一個(gè)頁(yè)表物理頁(yè)地址,物理頁(yè)地址是指頁(yè)的物理地址,在頁(yè)目錄項(xiàng)及頁(yè)表項(xiàng)中記錄的都是頁(yè)的物理地址,由于頁(yè)大小都是0x1000,即4096,因此頁(yè)地址是以000為結(jié)尾的16進(jìn)制數(shù)字。每個(gè)頁(yè)表中有1024個(gè)頁(yè)表項(xiàng),每個(gè)頁(yè)表項(xiàng)中是一個(gè)物理頁(yè)地址,最終數(shù)據(jù)是寫(xiě)在這頁(yè)表項(xiàng)中指定的物理頁(yè)中。頁(yè)表項(xiàng)中分配的物理頁(yè)地址在真正物理內(nèi)存中離散頒布,毫無(wú)規(guī)律可言,操作系統(tǒng)負(fù)責(zé)這些物理頁(yè)的分配與釋放。由于頁(yè)目錄表和頁(yè)表本身都要占用內(nèi)存,且為4KB大小,故它們也會(huì)由操作系統(tǒng)在物理內(nèi)存中分配一物理頁(yè)存放。圖中最粗的線是存放頁(yè)目錄表物理頁(yè),稍細(xì)一點(diǎn)的線指向的是用來(lái)存放頁(yè)表的物理頁(yè),其它最細(xì)的線是頁(yè)表項(xiàng)中分配的物理頁(yè),頁(yè)表結(jié)構(gòu)本身與其它數(shù)據(jù)混布滲透在物理內(nèi)存中,頁(yè)表所占用的物理頁(yè)在外在形式上與其它數(shù)據(jù)占用的物理頁(yè)沒(méi)有什么不同,只有cpu知道它們的作用不同。頁(yè)表在建立之初,物理內(nèi)存各部分的布局還是相對(duì)較整潔的,隨著操作系統(tǒng)分配或釋放內(nèi)存的動(dòng)作越來(lái)越頻繁,物理內(nèi)存的布局將更加零散。
二級(jí)頁(yè)表與一級(jí)頁(yè)表在原理上相同,但結(jié)構(gòu)上已經(jīng)有了很大不同,它們?cè)谔摂M地址到物理地址轉(zhuǎn)換方法上也很大不同。
我們已經(jīng)知道,前面所說(shuō)的一級(jí)頁(yè)表轉(zhuǎn)換方法,是將32位虛擬地址拆分成兩部分,高20位用于定位一個(gè)物理頁(yè),低12位用于物理頁(yè)內(nèi)的偏移量。在二級(jí)頁(yè)表轉(zhuǎn)換中,依然是用32位虛擬地址的不同部分來(lái)定位物理頁(yè)。
在二級(jí)頁(yè)表是這樣的:每個(gè)頁(yè)表中可容納1024個(gè)物理頁(yè),故每個(gè)頁(yè)表可表示的內(nèi)存容量是1024*4KB=4MB。頁(yè)目錄中共有1024個(gè)頁(yè)表,故所有頁(yè)表可表示的內(nèi)存容量是1024*4MB=4GB,這已經(jīng)達(dá)到了32位地址空間的最大容量。所以說(shuō),任意一個(gè)32位物理地址,它必然在某個(gè)頁(yè)表之內(nèi)的某個(gè)物理頁(yè)中。我們定位某一個(gè)物理頁(yè),必然要先找到其所屬的頁(yè)表。頁(yè)目錄中1024個(gè)頁(yè)表,只需要10位二進(jìn)制就能夠表示了,所以,虛擬地址的高10位(第31~22位)用來(lái)在頁(yè)目錄中定位一個(gè)頁(yè)表,也就是這高10位用于定位頁(yè)目錄中的頁(yè)目錄項(xiàng)PDE,PDE中有頁(yè)表物理頁(yè)地址。找到頁(yè)表后,到底是頁(yè)表中哪一個(gè)物理頁(yè)呢?由于頁(yè)表中可容納1024個(gè)物理頁(yè),故只需要10位二進(jìn)制就能夠表示了。所以虛擬地址的中間10位(第21~12位)用來(lái)在頁(yè)表中定位具體的物理頁(yè),也就是在頁(yè)表中定位一個(gè)頁(yè)表項(xiàng)PTE,PTE中有分配的物理頁(yè)地址。由于標(biāo)準(zhǔn)頁(yè)都是4KB,12位二進(jìn)制便可以表達(dá)4KB之內(nèi)的任意地址,故線性地址中余下的12位(第11~0位)用于頁(yè)內(nèi)偏移量。
經(jīng)以上分析,二級(jí)頁(yè)表地址轉(zhuǎn)換原理是,將32位虛擬地址拆分成高10位、中間10位、低12位三部分,它們的作用是:高10位做為頁(yè)表的索引,用于在頁(yè)目錄表中定位一個(gè)頁(yè)目錄項(xiàng)PDE,頁(yè)目錄項(xiàng)中有頁(yè)表物理地址,也就是定位到了某個(gè)頁(yè)表。中間10位做為物理頁(yè)的索引,用于在頁(yè)表內(nèi)定位到某個(gè)頁(yè)表項(xiàng)PTE,頁(yè)表項(xiàng)中有分配的物理頁(yè)地址,也就是定位到了某個(gè)物理頁(yè)。低12位做為頁(yè)內(nèi)偏移量用于在已經(jīng)定位到的物理頁(yè)內(nèi)尋址。
同一級(jí)頁(yè)表一樣,訪問(wèn)任何頁(yè)表內(nèi)的數(shù)據(jù)都要通過(guò)物理地址。由于頁(yè)目錄項(xiàng)PDE和頁(yè)表項(xiàng)PTE都是4字節(jié)大小,給出了PDE和PTE索引后,還需要在背后悄悄乘以4,再加上頁(yè)表物理地址,這才是最終要訪問(wèn)的絕對(duì)物理地址。轉(zhuǎn)換過(guò)程背后的具體步驟是:
這種自動(dòng)化較強(qiáng)的工作,還是由頁(yè)部件自動(dòng)完成的,
總結(jié)
以上是生活随笔為你收集整理的一步步编写操作系统 39 二级页表1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 兴业桃花信用卡:网购要积分刷它准没错
- 下一篇: 一步步编写操作系统 16 显卡概述