Linux內存管理之分頁機制

前面一篇文章講到邏輯地址到線性地址的轉換,也就是分段機制的實現.分段機制雖然能夠讓程序員方便

地管理程序的各個段,並且可以動態調整段的大小,而且對內存的碎片率也大大減小.但是還是沒有解決

程序大小比物理內存還大的問題,這時候就出現了分頁機制,分頁機制的出現最大的體現就是虛擬內存,虛

擬內存的實現可以讓大的程序裝入內存.分頁機制的實現還導致了部分程序裝入,按需分配內存,代碼共享

等. 根據上圖,邏輯地址通過分段機制變成線性地址,線性地址通過分頁機制變成物理地址。那麼怎麼獎線性

地址轉換成物理地址呢?首先,對於沒有啟用分頁機制的系統(通過一個寄存器的某一個比特判斷)。則直

接把線性地址映射到物理地址,物理地址傳入到地址總線上。若是啟用了分頁機制,CPU會把線性地址進行

拆分。

這裡引入先頁的概念,OS把虛擬內存切割,每部分的大小都是一樣的(一般可以根據硬件指定),每

部分就叫做頁(Page),每張頁都對應物理內存中的頁框(Page Frame,其實就是依次個對應的關係)。

但是線性地址中某個標號為N的頁,在物理內存中標號可以是M(N!=M)。也就說可以每個線性地址頁都

在物理內存中有相對應的頁框。而頁和頁框的對應關係是存在頁表裡面的,這裡可以這樣理解,頁是一個函

系統的輸入,頁框是一個系統的輸出,而頁表就是這個系統.但是一張頁表要處理整整4G(32位)的大小

,光光這張頁表就需要很大了.所以就引入二級頁表的概念,也可以說成是頁目錄,頁目錄的原理和前面頁

表的作用一樣,只不過頁目錄這個系統的輸入是頁號,而輸出是頁表的地址.

好了,理解了上面的基本概念之後,我們就開始線性地址到物理地址的轉換.對於一個線性地址,前面的10

bits當作頁目錄項,找到頁目錄項後就找到對應的頁表起始地址,根據線性地址的中間後面10bits(頁表的

偏移)+頁表起始地址,找到物理內存中的頁框地址,內存中的頁框地址+線性地址低12位就是實際的

物理地址.

同樣的,上述過程在訪問最終的物理內存之前,要進行兩次內存訪問,兩次查表,效率肯定就低了.現代

計算機會把頁表和頁目錄也用硬件進行緩存,當然是一部分常用的項.

綜上,分頁機制大概就是這麼個流程.


书籍推荐