《一個操作系統的實現》(三):3.頁式存儲

首先說一下頁的概念~頁就是一塊內存。下文只討論頁大小爲4KB的情況。

在未打開分頁機制時,線性地址等同於物理地址,即可以認爲邏輯地址通過分段機制直接轉換成物理地址。但開啓分頁時分段機制將邏輯地址轉換成線性地址,線性地址再通過分頁機制轉換成物理地址。分頁管理機制的目的就在於實現虛擬存儲器,這樣的話線性地址中任意一個頁都能映射到物理地址中的任何一個頁,使內存管理變得相當靈活。

轉換使用兩級頁表,第一級叫頁目錄,大小爲4KB,存儲在一個物理頁中,每個表項4字節長,共有1024個表項。每個表項對應第二級的一個頁表,第二級的每一個頁表也有1024個表項,每一個表項對應一個物理頁。頁目錄表的表項簡稱PDE(Page Directory Entry),頁表的表項簡稱PTE(Page Table Entry)。進行轉換時,先是從由寄存器cr3指定的頁目錄中根據線性地址的高10位得到頁表地址,然後在頁表中根據線性地址的第12到21位得到物理頁首地址,將這個首地址加上線性地址低12位便得到了物理地址。

分頁機制是否生效的開關位於cr0的最高位PG位(爲1時生效)。

PDE和PTE各位的解釋在這裏就省略了,可以參見這篇文章,cr3的結構也在這篇文章中。

處理器會將最近常用的頁目錄和頁表項保存在一個叫做TLB(Translation Lookaside Buffer,旁路轉換緩衝or頁表緩衝)的緩衝區中,只有在TLB中找不到被請求頁的轉換信息時纔到內存中尋找,可以大大加快訪問頁目錄和頁表的時間。當頁目錄或頁表項被更改時,操作系統應該馬上使TLB中對應的條目無效,以便下次用到此條目時讓它獲得更新。當cr3被加載時,所有TLB都會自動無效,除非頁或頁表條目的G位被設置。

我們有必要知道內存有多大,然後根據內存大小確定多少頁表是夠用的,而且一個操作系統也必須知道內存的容量,以便進行內存管理。一般可利用中斷15h來得到內存大小,還包括對不同內存段的一些描述(代碼在pmtest7.asm中)。這篇文章講了獲取機器內存的三種方法,其中有中斷15h的詳細介紹~

對於不同進程有相同地址的情況,原理實在任務切換的時候通過改變cr3的值來切換頁目錄,從而改變地址映射關係。


這節雖然內容不少,但是寫出來的內容沒多少,不少內容都是在說什麼代碼實現了怎樣的過程,就不在這贅述了。(唉,彙編的東西還是看得很暈,不求把這些彙編代碼都理解,先把過程啊機制啊理解了再說~)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章