轉自:http://hi.baidu.com/formerdays/blog/item/5ddaad4e06564e0eb3de05c1.html
在儲存段描述符中,屬性地區的TYPE由位0-3組成。位3稱為E位,E=1,表示此描述符用於描述程式碼片段。位2稱為C位,位C=1,表示對應的程式碼片段是一致程式碼片段;位C=0,表示對應的程式碼片段不是一致程式碼片段.
所謂的“一致程式碼片段”,目的是為了共用,比如該一致程式碼片段的特權級是2,那麼即使是特權級是3的代碼,也可以訪問該一致代碼。也就是允許低許可權的代碼訪問 高許可權的代碼,而成功訪問之後,當前的特權級並不是目標代碼的特權級,而是原來代碼的特權級,也就是說,跳轉之後,CPL不變。要注意的是,一致程式碼片段的 DPL的定義,它定義的是允許訪問改一致程式碼片段的最高許可權,也就是說,如果一個許可權比一致程式碼片段中DPL的許可權還要高的話,是不允許訪問該一致程式碼片段的。
總結:一致程式碼片段的DPL規定了成功訪問它的最高許可權,高於這個許可權的代碼不能成功訪問它。成功訪問一致程式碼片段後,CPL並不會改變,還是保持為原來的許可權。這樣的設定主要是為了共用,比如一些函數庫之類的,而不用受到許可權的限制.對於非一致程式碼片段,要求CPL=DPL,RPL<=DPL.對於非一致程式碼片段,只允許同特權級的轉移
原因:
1.低特權級下不能調用高特權級的代碼,即保護高特權級的代碼.
2.高特權級下不能調用低特權級的代碼,為了避免低特權級代碼獲得高特權級從而能執行某些系統指令.1.
一致程式碼片段的轉移,轉移後的CPL不變
對於非一致程式碼片段的轉移與通過調用門轉移,轉移後的CPL就是段的DPL.
2.
而給其他段寄存器賦值(除CS以外)時,賦值後該寄存器的RPL就是選擇子的RPL.DPL是儲存段的允許存取權限級,CPL是CPU的當前特權級,代表當前程式的特權級。RPL是選擇子的請求存取權限級。對非一致程式碼片段,要求代表當前程 序特權級的當前程式特權級CPL必須等於儲存段的允許存取權限級DPL,也就是說,對於非一致程式碼片段,程式只能訪問相同特權級的儲存段。選擇子的請求訪問 特權級RPL必須高於儲存段的允許存取權限級DPL。