頁、頁表和塊



CPU通過虛擬地址空間來間接訪問內存的物理內存地址;

虛擬地址空間,操作系統為進程分配的邏輯地址;
操作系統負責將虛擬地址空間和物理內存地址之間建立映射關系

 

虛擬地址空間的訪問單位叫做頁;一頁大小一般在512Byte~8K之間;並且每個頁都有編號;
物理地址按照同樣的大小為單位,叫做塊;並且每個塊都有編號;

操作系統通過維護一張表,即頁表;來維護虛擬頁和物理塊之間的映射關系;

頁表放在物理內存中,有操作系統負責維護;


一個4G虛擬地址空間,將會產生1024*1024個頁,頁表的每一項存儲一個頁和一個塊的映射,所以,至少需要1M個頁表項。
如果一個頁表項大小為1Byte,則至少需要1M的空間,所以頁表被放在物理內存中,由操作系統維護。
每個進程都有一張頁表,頁表的起始地址和長度信息在進程不被CPU執行時,放在PCB中;

 

先將具體的虛擬地址A/頁面大小4K,結果的商作為頁表號,結果的余作為業內地址偏移。
CPU訪問的虛擬地址:A
頁面:L
頁表號:(A/L)
頁內偏移:(A%L)

虛擬地址結構
31 - 12 //頁表號
11 - 0 //頁內偏移

CPU中有頁表寄存器,存放當前進程的頁表起始地址和頁表長度;

 

將上述計算的頁表號和頁表長度進行對比,確認在頁表范圍內,
然后將頁表號和頁表項長度相乘,得到目標頁相對於頁表基地址的偏移量。
最后加上頁表基地址偏移量就可以訪問到相對應的塊了。
CPU拿到框的起始地址之后,再把頁內偏移地址加上,訪問到最終的目標地址。

按照上述的過程,可以發現,CPU對內存的一次訪問動作需要訪問兩次物理內存才能達到目的,
第一次,拿到框的起始地址,第二次,訪問最終物理地址。

為了提高CPU對內存的訪問效率,在CPU第一次訪問內存之前,
加了一個快速緩沖區寄存器,它里面存放了近期訪問過的頁表項。

 

頁表分級:
分級的本質其實也是將頁表項進行分組管理;
考慮到進程內存大部分空閑以及局部性,因此實際記錄的時候大部分的記錄是沒有的;
也就不需要拿出一大段連續的空間來作為頁表記錄映射關系;
頁表項存儲的是物理內存一頁的物理地址,因此一個頁表項只能指向一頁;或者叫一塊;

兩級分頁機制將32位的虛擬空間分成三段;
低十二位表示頁內偏移,高20分成兩段分別表示兩級頁表的偏移。
* PGD(Page Global Directory): 最高10位,全局頁目錄表索引
* PTE(Page Table Entry):中間10位,頁表入口索引
在進行地址轉換時,結合CR3寄存器中存放的全局頁表物理地址,然后加上虛擬地址的高10位也就是PGD段,作為頁表偏移找到相應的頁表項,從改頁表項得到二級頁表的物理地址,然后結合中間十位即PTE段,作為偏移找到PTE項,即獲得了要訪問的內存地址所在的物理頁,然后結合Page Offset即定位到了需要訪問的物理內存,這樣就完成了從虛擬地址到物理地址的轉換。
如果沒有緩存的情況下,整個過程需要三次內存訪問。
//分級頁表節約了空間,當然增加了訪問內存的次數;犧牲了時間;


Linux的三級頁表:
Intel通過在處理器上把管腳數從32增加到36,以提高處理器的尋址能力,使其達到236=64GB,
但是linux依然使用32位的虛擬尋址空間,為此,需引入一種新的分頁機制。
如果頁的大小依然是4k, 64G的內存可以分為224個頁框;

如果頁的大小依然是4k,64G(234)的內存可以分為2的24次方個頁框,
然后頁表項的物理地址字段從20位擴展到24位,每個頁表項必須包含12個標志位(固定)和24個物理地址位(36-12),共36位,因此,每個頁表項須從32位擴展到64位(36位>32位,考慮到對齊,因此應將頁表項擴大一倍到64位)。
所以原來32位的頁表項現在變成了64位后,一頁可以存儲的頁表項從1024變成了512,需要9位進行尋址,高一級的頁表也需要9位,加上頁內偏移12位,現在32位的地址還剩余2位,因此又引入一級頁表,該頁表只含有4個頁表項。這樣就解決了PAE情況下的分頁。

雖然頁表項擴展到了64位,選址達到了36位,即64G的空間,但是實際上一個進程可以使用的虛擬空間大小仍然是4G,
因為虛擬地址依然只有32位,即使每個頁表項都填滿也只能有4G的空間。
唯一不同的是物理內存進行分配時候就可以使用超過4G的空間了。

 

Linux的四級頁表:
隨着硬件的發展,64位的CPU出現了,這個時候基於32位處理器的三級頁表又不能使用了,不過現在的硬件已經可以支持四級頁表了,
可以使用48位的虛擬空間了(虛擬空間的位數和硬件的對應關系理的還不是很清楚),經過前輩們的爭論,最后確定了下面的四級頁表形式:



 

參考文檔:

linux-----頁、頁表、頁框(塊):https://blog.csdn.net/u014338577/article/details/82750771
操作系統頁表管理:https://blog.csdn.net/kongdefei5000/article/details/70183178


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM