Linux操作系統:分頁管理技術

分頁的基本概念

(1)邏輯空間分頁

將一個進程的邏輯地址空間劃分成若干大小相等的部分,每個部分稱作頁面或頁。每頁都有一個編號,叫做頁號,頁號從0開始依次編排,如0,1,2……。

(2)內存空間分塊

把內存劃分成與頁面相同大小的若干存儲塊,稱作內存塊。塊號從0開始依次順序排列:0#塊,1#塊,2#塊,……。頁面(或塊)的大小是由硬件確定的,它一般選擇為2的若干次冪。不同機器中頁面大小是有區別的,例如,IBM AS/400規定的頁面大小為512 B,即,29,而Intel 80386的頁面大小為4 KB(即212,4096 B)。

(3)邏輯地址表示

在分頁存儲管理方式中,表示地址的結構如下圖所示。


Linux操作系統:分頁管理技術

它由兩部分組成:前一部分表示該地址所在頁面的頁號p;後一部分表示頁內位移d,即頁內地址。本圖中所示的兩部分構成的地址長度為32位。其中0~11位為頁內地址,即每頁的大小為4 KB,212;12~31位為頁號,表示地址空間中最多可容納220個頁面。

計算:根據邏輯地址計算頁號和頁內地址?

對於某臺具體機器來說,其地址結構是一定的。如果給定的邏輯地址是A,頁面的大小為L,則頁號p和頁內地址d可按下式求得:

p = INT[A/L] , d = [A] MOD L

其中,INT是向下整除的函數,MOD是取餘函數。

舉例:設某系統的頁面大小為1 KB, 邏輯地址A為3456,則頁號p=INT (3 456/1 024) =3,頁內地址d= 3 456 MOD 1 024 = 384。用一個數對(p, d)來表示就是(3,384)。

(4)內存分配原則

在分頁情況下,系統以塊為單位把內存分給各個進程,進程的每個頁面對應一個內存塊,並且一個進程的若干頁可以分別裝入物理上不連續的內存塊中。

(5)設立頁表

在分頁系統中,允許將進程的各頁面離散地裝入內存的任何空閒塊中,這樣就出現進程的頁號連續、而塊號不連續的情況。怎樣找到每個頁面在內存中對應的物理塊呢?為此,系統為每個進程設立一張頁面映像表,簡稱頁表。頁表的作用是實現從頁號到物理塊號的地址映射。

如下圖所示,在進程地址空間內的所有頁(0~n-1)依次在頁表中有一個頁表項,其中記載了相應頁面在內存中對應的物理塊號。進程執行時,按照邏輯地址中的頁號查找頁表中的對應項,找到該頁在內存中的物理塊號。

Linux操作系統:分頁管理技術

(6)建立內存塊表

操作系統管理整個內存,它必須知道哪些塊已經分出去了,哪些塊還是空閒的,總共有多少塊等物理存儲的情況。這些信息保存在稱作內存塊表的數據結構中,整個系統有一個內存塊表。每個內存塊在內存塊表中佔一項,表明該塊當前空閒還是已分出去了;如果已分出去,是分給哪個進程的哪個頁面了。

地址映射

計算:根據邏輯地址和頁表計算物理地址

通常,頁表都放在內存中。當進程需要訪問某個邏輯地址中的數據時,分頁地址映像硬件自動按頁面大小將CPU得到的相對地址分成兩部分:頁號和頁內地址(p, d),具體步驟如下:

① 用頁號p為索引去檢索頁表從頁表中得到該頁的物理塊號f,把它裝入物理地址寄存器中。

② 將頁內地址d直接送入物理地址寄存器的塊內地址字段d中。

③物理地址寄存器中的內容就是由二者拼接成的實際訪問內存的地址,從而完成從邏輯地址到物理地址的轉換。

Linux操作系統:分頁管理技術

頁的共享和保護

(1)頁面共享

在多道程序系統中,數據共享很重要。尤其在一個大型分時系統中,往往有若干用戶同時運行相同的程序(如編輯程序、編譯程序)。很顯然,更有效的辦法是共享頁面,避免同時在內存中有同一頁面的兩個副本。

頁面共享的方法是使這些相關進程的邏輯空間中的頁指向相同的內存塊(該塊中放有共享程序或數據)。應當指出,在分頁系統中實現頁面共享是比較困難的,並非所有頁面都可共享。實際上,那些只讀的頁面(如程序文件)可以被共享,而數據頁面往往並不能共享。

下圖示出了三個進程共享5#內存塊中文本數據的情況。

Linux操作系統:分頁管理技術

(2)頁面保護

頁面保護是分頁系統中的另一個必須小心處理的問題。即使在單純分頁系統(沒有采用虛擬存儲技術的分頁系統)中,也常在頁表的表項中設置存取控制字段,用於指明對應內存塊中的內容允許執行何種操作,從而禁止非法訪問。一般設定為只讀(R)、讀寫(RW)、讀和執行(RX)等權限。如果一個進程試圖去寫一個只允許讀的內存塊時,則會引起操作系統的一次中斷——非法訪問性中斷,操作系統會拒絕該進程的這種嘗試,從而保護該塊的內容不被破壞。

(3)分頁技術的總結

分頁技術可以用36個字來總結:

邏輯空間分頁 物理空間分塊

頁與塊一樣大 頁連續塊離散

用頁號查頁表 由硬件做轉換


分享到:


相關文章: