保護機制

分頁保護


概論

除了分段形式的保護機制之外,還有分頁的保護機制。分頁的保護機制是以分頁為單位,有兩個特權層次:一是 supervisor 等級(等級 0)、一是 user 等級(等級 1)。分頁保護和分段保護一樣,是在存取記憶體位址之前進行的。如果違反了分頁保護,則不會存取記憶體的內容,而且會導致 page-fault(#PF)的例外。
分頁保護除了等級的保護之外,還有讀寫權的保護。一個分頁若設定為唯讀,就不能把資料寫到這個分頁中了。
在分頁目錄和分頁表的 entry 中,有兩個旗標:R/W 旗標和 U/S 旗標,分別代表分頁的讀寫權和特權層次(參考「記憶體管理」的「分頁架構」)。這兩種保護機制對分頁目錄和分頁表都有效。
 

分頁的特權層次

在分頁目錄和分頁表的 entry 中,U/S 旗標表示一個分頁的特權層次。若 U/S 為 0,則分頁是 supervisor 等級,否則為 user 等級。所有的程序都可以存取 user 等級的分頁,但是只有 CPL 為 0、1、2 的程序才可以存取 supervisor 等級的分頁。因此,我們把 CPL 為 3 的程序稱為 user 模式;而把 CPL 為 0、1、2 的程序稱為 supervisor 模式。在一個簡單的系統中,可能會使用最簡單的分段方式,即把所有的資料、程式分段都混合在一起。這時,分頁保護就可以提供最基本的保護。把系統程式放在 supervisor 等級的分頁,而把使用者程式放在 user 等級的分頁,就可以做到最起碼的保護能力了。
分頁的特權層次,是由分頁目錄和分頁表的特權合併而成的。在分頁目錄或分頁表中,其中一個的等級是設為 supervisor 時,則分頁的等級就視為 supervisor。只有在分頁目錄和分頁表中的特權層次都是 user 時,分頁的等級才是 user。在讀寫權的設定也是一樣。只有在分頁目錄和分頁表的讀寫權都是可任意讀寫時,分頁才可以任意讀寫;否則,分頁會被視為唯讀的分頁。
 

分頁的讀寫權

把分頁的 R/W 旗標設為 0,表示分頁是唯讀的,否則表示分頁是可以任意寫入的。當 CR0 中的 WP 旗標(第 16 bit)設為 0 時,對 supervisor 等級的程式來說,所有的分頁都是可任意讀寫的,即分頁的 R/W 旗標只對 user 等級的程式有效。而在 WP 旗標設為 1 時,則 R/W 旗標對所有等級的程式都有效;也就是說,即使是 supervisor 等級的程式,也不能寫入唯讀的分頁。
這個功能可以在某些場合中,節省記憶體的使用。例如,在 UNIX 作業系統中,使用 fork 函式來建立子程序時,必須把資料節區複製一份給子程序。但是,利用這個功能,系統可以先不複製節區,而把母程序的節區的分頁對映到子程序,讓子程序使用,但是把子程序中的分頁設為唯讀。當子程序試圖寫入其中一個分頁時,會產生例外,這時系統才需要為子程序建立一個自己的分頁,並把資料複製一份。這樣就可以節省很多記憶體和時間。
 

分頁保護和分段保護

處理器在存取記憶體時,會先考慮分段保護。如果分段保護的設定允許讀取動作,處理器才會考慮分頁保護。只有在分段保護和分頁保護的檢查都通過時,處理器才會存取記憶體的內容。因此,分頁保護的設定並不能取代分段保護的設定。分頁保護可以用來加強分段保護,在一個可任意讀寫的分段中,可以把某些分頁設定為只能讀取。
在某些特殊情形下,分頁保護會被忽略,如同是由 CPL 為 0 的程式存取一般。這些情形包括: