Linux kernel 学习笔记(1) --分段分页保护机制
使用80x86處理器進行尋址時牽涉到三種不同的地址,其關系如下所示
?
邏輯地址------------------->線性地址-------------------------->物理地址
???????????????? (分段)???????????????????????????? (分頁)
分段的保護機制:
?
一個邏輯地址由兩部分組成:段標識符和偏移量。其中偏移量是一個32位長的字段,段標識符是一個16位長的字段,稱為段選擇符,含有一個13位的段描述符索引,一個1位的GDT和LDT指示位和一個兩位的請求者特權級。
請求者特權級(RPL)是用來指示當前CPU的特權級。0代表最高優先級,3代表最低優先級,Linux只用0和3,分別稱之為內核態和用戶態。
?
為了快速方便的找到段選擇符,處理器提供了段寄存器,段寄存器的唯一目的是存放段選擇符,其中CS寄存器中包含一個兩位的字段,用來指明CPU的當前優先級(CPL)。
?
段描述符是由8個字節來表示段的特性,它被保存在全局描述符表(GDT)和局部描述符表(LDT)中,由于段描述符的內容較多,在此不一一介紹。關鍵的有一個兩位表示的描述符特權級(DPL),主要用于限制對這個段的存取,它表示可以訪問這個段的最小CPU優先級。
?
以上三段共提到3個特權級,分別是RPL、CPL和DPL。是不是有點暈了,不著急,下面說明三個的關系。
?
DPL:描述符特權級(Descriptor Privilege Level)
存儲在描述符中的權限位,用于描述代碼的所屬的特權等級,也就是代碼本身真正的特權級。一個程序可以使用多個段(Data,Code,Stack)也可以只 用一個code段等。正常的情況下,當程序的環境建立好后,段描述符都不需要改變——當然DPL也不需要改變,因此每個段的DPL值是固定。
CPL:當前特權級(Current Privilege Level)
是CS?register?里bit?0和bit?1?位組合所得的值.在某一時刻就只有這個值唯一的代表程序的CPL。在Linux系統中代表當前處于內核態還是用戶態。
?
RPL:請求特權級RPL(Request Privilege Level)
RPL保存在選擇子的最低兩位。 RPL 說明的是進程對段訪問的請求權限,意思是當前進程想要的請求權限。 RPL 的 值 由程序員自己來自由的設置,并不一定RPL>=CPL,但是當RPL<CPL時,實際起作用的就是CPL了,因為訪問時的特權檢查是判 斷:EPL=max(RPL,CPL)<=DPL 是否成立,所以RPL可以看成是每次訪問時的附加限制,RPL=0時附加限制最小,RPL=3時附 加限制最大。所以你不要想通過來隨便設置一個rpl來訪問一個比cpl更內層的段。
因為你不可能得到比自己更高的權限,你申請的權限一定要比你實際權限低才能通過CPU的審查,才能對你放行。所以實際上RPL的作用是程序員可以把自己的程序降級運行——有些時候為了更好的安全性,程序可以在適當的時機把自身降低權限(RPL設成更大的值)。
?
段機制中使用特權級實現自己的保護機制
?
分頁的保護機制:
?
分頁機制中將32位的線性地址分成3個域
目錄項 (高10位)
頁表項(中10位)
偏移量(低12位)
?
頁目錄項和頁表項具有相同的結構其中與權限有關的有:
Read/Write標志
讀寫特權,如果為0,表示相應頁表或者頁是只讀的,如果為1,則表示可讀寫。
User/Supervisor標志
和頁表相關的特權級只用兩個,如果該標志為0,處于內核態時才能尋址,如果標志為1,總能對頁尋址。
總結
以上是生活随笔為你收集整理的Linux kernel 学习笔记(1) --分段分页保护机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在麻省理工读计算机专业,看美国的计算机教
- 下一篇: 中继器 集线器 网桥 交换机 路由器 网