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