前面一篇文章講到邏輯地址到線性地址的轉換,也就是分段機制的實現.分段機制雖然能夠讓程序員方便
地管理程序的各個段,並且可以動態調整段的大小,而且對內存的碎片率也大大減小.但是還是沒有解決
程序大小比物理內存還大的問題,這時候就出現了分頁機制,分頁機制的出現最大的體現就是虛擬內存,虛
擬內存的實現可以讓大的程序裝入內存.分頁機制的實現還導致了部分程序裝入,按需分配內存,代碼共享
等. 根據上圖,邏輯地址通過分段機制變成線性地址,線性地址通過分頁機制變成物理地址。那麼怎麼獎線性
地址轉換成物理地址呢?首先,對於沒有啟用分頁機制的系統(通過一個寄存器的某一個比特判斷)。則直
接把線性地址映射到物理地址,物理地址傳入到地址總線上。若是啟用了分頁機制,CPU會把線性地址進行
拆分。
這裡引入先頁的概念,OS把虛擬內存切割,每部分的大小都是一樣的(一般可以根據硬件指定),每
部分就叫做頁(Page),每張頁都對應物理內存中的頁框(Page Frame,其實就是依次個對應的關係)。
但是線性地址中某個標號為N的頁,在物理內存中標號可以是M(N!=M)。也就說可以每個線性地址頁都
在物理內存中有相對應的頁框。而頁和頁框的對應關係是存在頁表裡面的,這裡可以這樣理解,頁是一個函
系統的輸入,頁框是一個系統的輸出,而頁表就是這個系統.但是一張頁表要處理整整4G(32位)的大小
,光光這張頁表就需要很大了.所以就引入二級頁表的概念,也可以說成是頁目錄,頁目錄的原理和前面頁
表的作用一樣,只不過頁目錄這個系統的輸入是頁號,而輸出是頁表的地址.
好了,理解了上面的基本概念之後,我們就開始線性地址到物理地址的轉換.對於一個線性地址,前面的10
bits當作頁目錄項,找到頁目錄項後就找到對應的頁表起始地址,根據線性地址的中間後面10bits(頁表的
偏移)+頁表起始地址,找到物理內存中的頁框地址,內存中的頁框地址+線性地址低12位就是實際的
物理地址.
同樣的,上述過程在訪問最終的物理內存之前,要進行兩次內存訪問,兩次查表,效率肯定就低了.現代
計算機會把頁表和頁目錄也用硬件進行緩存,當然是一部分常用的項.
綜上,分頁機制大概就是這麼個流程.