一步步编写操作系统 37 一级页表与虚拟地址2
接上節(jié),分頁機制是建立在分段機制之上,與其脫離不了干系,即使在分頁機制下的進程也要先經(jīng)過邏輯上的分段才行,每加載一個進程,操作系統(tǒng)按照進程中各段的起始范圍,在進程自己的4GB虛擬地址空間中尋找可有空間分配內(nèi)存段,此虛擬地址空間可以是頁表,也可以是操作系統(tǒng)維護的某種數(shù)據(jù)結(jié)構(gòu),總之此階段的分配是邏輯上的,并沒有真正寫入物理內(nèi)存。代碼段和數(shù)據(jù)段在邏輯上被拆分成以頁為單位的小內(nèi)存塊。這時的虛擬地址虛如其名,不能存放任何數(shù)據(jù)。接著操作系統(tǒng)開始為這些虛擬內(nèi)存頁分配真實的物理內(nèi)存頁,它查找物理內(nèi)存中可用的頁,然后在頁表中登記這些物理頁地址,這樣就完成了虛擬頁到物理頁的映射,每個進程都以為自己獨享4G地址空間。
以上在宏觀上籠統(tǒng)地介紹了分頁機制下操作系統(tǒng)加載用戶進程的整個流程,先讓大家心中有數(shù),了解我們下面所說的內(nèi)容是什么。也許您對此過程并不十分理解,不過沒關(guān)系,下面咱們開始從頭說起。
映射這個概念大家應(yīng)該比較清楚,對應(yīng)的英文單詞是map,意為地圖。地圖是對實際地理空間的一種抽象,地圖上的每個位置都代表某個真實地理空間,這種地圖上與地理上一一對應(yīng)的關(guān)系就稱為映射。
在內(nèi)存地址中,最簡單的映射方法是逐字節(jié)映射,即一個線性地址對應(yīng)一個物理地址。比如線性地址為0x0,其對應(yīng)的物理地址可以是0x0、0x10或其它你喜歡的數(shù)字,若線性地址為0x1,對應(yīng)的物理地址為0x1、0x11或其它你喜歡的數(shù)字。我們需要找個地方來存儲這種映射關(guān)系,這個地方就是頁表,Page Table。頁表就是個N行1列的表格,頁表中的每一行(只有一個單元格)稱為頁表項PTE(Page Table Entry),其大小是4字節(jié),頁表項的作用是用來存儲內(nèi)存物理地址。當訪問一個線性地址時,實際上就是在訪問頁表項中所記錄的物理內(nèi)存地址。
頁表與物理內(nèi)存關(guān)系示意如下圖所示:
如果采用這種線性地址與物理地址一一映射的方案:
分頁機制本質(zhì)上是將大小不同的大內(nèi)存段拆分成大小相等的小內(nèi)存塊。以上方案其實就是將4GB空間劃分成4G個內(nèi)存塊,每個內(nèi)存塊大小是1字節(jié)。頁表也是存儲在內(nèi)存中的,為了表示32位地址,每個頁表項必須要4字節(jié),若按此方案,光是頁表就要占 16GB內(nèi)存,得不償失,顯然方案不合理。
以上方案不成立的原因是內(nèi)存塊數(shù)量太大了,也就是說,在總的4GB地址空間恒定不變的情況下,內(nèi)存塊尺寸選的太小了。為了找到合適的內(nèi)存塊大小,我們做下列分析與嘗試。
任意進制的數(shù)字都可以分成高位部分和低位部分,若將低位部分理解為單位大小,高位部分則是這種單位的數(shù)量。如六萬的十進制可表示為60000,也可以表示為60千。也就是將60000分成高位60和低位1000兩部分。
為了節(jié)省頁表空間,勢必要將滑塊往左調(diào)整,以使內(nèi)存塊尺寸變大,這樣內(nèi)存塊數(shù)量變小,從而減少了頁表項數(shù)量。如果滑塊指向第20位,內(nèi)存塊大小則為2的20次方,即1MB,內(nèi)存塊數(shù)量則為2的12次方,即4K個。若滑塊指向第12位,內(nèi)存塊大小則為2的12次方即4KB,內(nèi)存塊數(shù)量則為2的20次方,1M,即1048576個。這里所說的內(nèi)存塊,其官方名稱是頁,cpu中采用的頁大小恰恰就是4KB,也就是上圖中滑塊的落點處。
總結(jié)
以上是生活随笔為你收集整理的一步步编写操作系统 37 一级页表与虚拟地址2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 巴菲特午餐拍卖以1900万美元成交:23
- 下一篇: 一步步编写操作系统 07 开机启动bio