【操作系統】多級頁表機制

第一種方法是採用多級頁表。一個簡單的例子如圖所示。在圖a中,32位的虛擬地址被劃分爲10位的PT1域、10位的PT2域和12位的Offset(偏移量)域。因爲偏移量是12位,所以頁面長度是4KB,共有220 個頁面。

引入多級頁表的原因是避免把全部頁表一直保存在內存中。特別是那些從不需要的頁表就不應該保留。比如一個需要12MB內存的進程,其最底端是4MB的程序正文段,後面是4MB的數據段,頂端是4MB的堆棧段,在數據段上方和堆棧段下方之間是大量根本沒有使用的空閒區。

考察圖b例子中的二級頁表是如何工作的。在左邊是頂級頁表,它具有1024個表項,對應於10位的PT1域。當一個虛擬地址被送到MMU時,MMU首先提取PT1域並把該值作爲訪問頂級頁表的索引。因爲整個4GB(32位)虛擬地址空間已經被分成1024個4MB的塊,所以這1024個表項中的每一個都表示4MB的虛擬地址空間。

在這裏插入圖片描述

由索引頂級頁表得到的表項中含有二級頁表的地址或頁框號。頂級頁表的表項0指向程序正文的頁表,表項1指向數據的頁表,表項1023指向堆棧的頁表,其他的表項(用陰影表示的)未用。現在把PT2域作爲訪問選定的二級頁表的索引,以便找到該虛擬頁面的對應頁框號。

下面看一個示例,考慮32位虛擬地址0x00403004(十進制4 206 596)位於數據部分12 292字節處。它的虛擬地址對應PT1=1,PT2=2,Offset=4。MMU首先用PT1作爲索引訪問頂級頁表得到表項1,它對應的地址範圍是4M~8M。然後,它用PT2作爲索引訪問剛剛找到的二級頁表並得到表項3,它對應的虛擬地址範圍是在它的4M塊內的12 288~16 383(即絕對地址4 206 592~4 210 687)。這個表項含有虛擬地址0x00403004所在頁面的頁框號。如果該頁面不在內存中,頁表項中的“在/不在”位將是0,引發一次缺頁中斷。如果該頁面在內存中,從二級頁表中得到的頁框號將與偏移量(4)結合形成物理地址。該地址被放到總線上並送到內存中。

值得注意的是,雖然在圖中虛擬地址空間超過100萬個頁面,實際上只需要四個頁表:頂級頁表以及0~4M(正文段)、4M~8M(數據段)和頂端4M(堆棧段)的二級頁表。頂級頁表中1021個表項的“在/不在”位都被設爲0,當訪問它們時強制產生一個缺頁中斷。如果發生了這種情況,操作系統將注意到進程正在試圖訪問一個不希望被訪問的地址,並採取適當的行動,比如向進程發出一個信號或殺死進程等。在這個例子中的各種長度選擇的都是整數,並且選擇PT1與PT2等長,但在實際中也可能是其他的值。

圖所示的二級頁表可擴充爲三級、四級或更多級。級別越多,靈活性就越大,但頁表超過三級會帶來更大的複雜性,這樣做是否值得令人懷疑。

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