1. 程式人生 > >操作系統學習(九) 、訪問數據段時的特權級檢查

操作系統學習(九) 、訪問數據段時的特權級檢查

區域 系統 才會 使用 執行 有效 以及 選擇 改變

為了訪問數據段中的操作數,數據段的段選擇符必須被加載進數據段寄存器(DS,ES,FS或GS)或堆棧段寄存器(SS)中。可以使用指令MOV、POP、LDS、LES、LFS、lGS和LSS來加載段寄存器。

在把一個段選擇符加載進段寄存器之前,處理器會進行特權級檢查,它會把當前運行程序或任務的CPL、段選擇符的RPL和段描述符的DPL進行比較。只有當段的DPL數值大於或等於CPL和RPL時,處理器才會把選擇符加載進段寄存器中。否則就會產生一個一般保護異常,並且不加載段選擇符。

訪問數據段時的特權級檢查:
技術分享圖片

可知一個程序或任務可尋址的區域隨著其CPL改變而變化。當CPL是0時,此時所有特權級是的數據段都可被訪問;當CPL是1時,只有在特權級1到3的數據段可被訪問;當CPL是3時,只有處於特權級3的數據段可被訪問。

另外,有可能會把數據段保存在代碼段中。例如,當代碼和數據是在ROM中時。因此,有些時候我們會需要訪問代碼段中的數據。此時我們可以使用以下方法來訪問代碼段中的數據:

  1. 把非一致可讀代碼段的選擇符加載進一個數據段寄存器中。
  2. 把一致可讀代碼段的選擇符加載進一個數據段寄存器中。
  3. 使用代碼段覆蓋前綴(CS)來讀取一個選擇符已經在CS寄存器中的可讀代碼段。

訪問數據段的相同規則也使用與方法1。方法2則總是有效的,因為一致代碼段的特權級等同於CPL,而不管代碼段的DPL。方法三也總是有效的,因為CS寄存器的選擇的代碼段的DPL與CPL相同。

當使用堆棧段選擇符加載SS寄存器時也會執行特權級檢查。這裏與堆棧段相關的所有特權級必須與CPL匹配,也即,CPL、堆棧段選擇符RPL以及堆棧段描述符的DPL都必須相同。如果RPL或DPL與CPL不同,處理器就會產生一個一般保護異常。

操作系統學習(九) 、訪問數據段時的特權級檢查