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