特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS
生活随笔
收集整理的這篇文章主要介紹了
特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README
text description from orange’s implemention of a os .
【1】特權級概述
當當前代碼段試圖訪問一個段或者門時,目標段的DPL將會和 CPL 以及段或門選擇子的RPL相比較,如何比較:(這里是干貨)
- (1)數據段: DPL規定了可以訪問此段的最低特權級;如一個數據段的DPL=1,那么只有CPL=0或1的程序才有權訪問;
- (2)調用門: DPL規定了當前執行的程序或任務可以訪問此調用門的最低特權級(這與數據段是一致的);
- (3)TSS: DPL規定了可以訪問此TSS的最低特權級(這與數據段的規則是一致的);
- (4)非一致代碼段(不使用調用門的情況下): DPL規定了訪問此段的特權級;如一個非一致代碼段的特權級為0,那么只有CPL=0的程序才可以訪問;
- (5)一致代碼段和非一致代碼段(使用調用門的情況下): DPL規定了訪問此段的最高特權級;如一個一致代碼段的DPL=2,那么CPL=0或1 的程序將無法訪問此段;
- (5.1)即是說, 一致代碼段允許低特權級訪問高特權級,不允許高特權級訪問第特權級;
- (5.2)通過調用門訪問的非一致代碼段的特權級驗證也是這樣: 允許低特權級訪問高特權級,不允許高特權級訪問低特權級;
- (6)以上的特權級檢驗(除開RPL)的話,都是允許同級特權級代碼段間的訪問的;
【2】RPL-requested privilege level-請求特權級
- 2.1) RPL 是通過段選擇子的第0位和第1位表現出來的;
- 2.2)即是說, 如果RPL的數字比CPL的數字大(即,其特權級比較小),那么RPL將會起決定性作用, 反之亦然;
- 2.3) os 過程往往用 RPL 來避免低特權級應用程序訪問高特權級段內的數據;
【3】不同特權級間的轉移
使用jmp 或 call 指令可以實現以下4 種轉移:
- 3.1) 目標操作數包含目標代碼段的段選擇子;
- 3.2) 目標操作數指向一個包含目標代碼段選擇子的調用門描述符;
- 3.3) 目標操作數指向一個包含目標代碼段選擇子的TSS;
- 3.4) 目標操作數指向一個任務門, 這個任務門指向一個包含目標代碼段選擇子的TSS;
我們來看看通過調用門來訪問代碼段是如何進行特權級驗證的?(干貨)
假設我們想由代碼A 轉移到 代碼B,運用一個調用門G ,即調用門G中的目標選擇子指向代碼B的段。進行特權級驗證,涉及這么幾個要素:CPL、RPL、代碼B 的DPL(DPL_B)、調用門G 的DPL(DPL_G)。特權級驗證方法如下(methods):
- M1) A訪問G 這個調用門時,規則相當于訪問一個數據段,要求 CPL 和 RPL 都小于或者等于DPL_G。即是,CPL 和 RPL 需要比 DPL_G 更高的特權級上;
- M2) 如果M1的驗證通過的話,系統還要比較CPL 和 DPL_B;
- M2.1) 如果代碼B 是一致代碼段的話,要求DPL_B <= CPL;
- M2.2) 如果代碼B 是非一致代碼段的話,call 指令 和 jmp指令又會不同;
- M2.2.1) 在用call 指令時,要求 DPL_B <= CPL;
- M2.2.2) 在用jmp時,只能是 DPL_B=CPL;
使用調用門進行轉移時特權級檢驗的規則(call + jmp 跳轉指令)
將上圖做個總結-Conclusion:
- C1)目標是一致代碼段: DPL_B<=CPL<=DPL_G && RPL<=DPL_G
- C2)目標是非一致代碼段
- C2.1)采用 call 指令調用: DPL_B<=CPL<=DPL_G && RPL<=DPL_G
- C2.2)采用 jmp 指令調用: DPL_B<=CPL<=DPL_G && RPL=DPL_G
(Attention)
因為從低特權級 跳轉到 高特權級,是需要切換堆棧的,所以這就必須要用到TSS了。TSS里面存儲有ring0~ring2共3個特權級的堆棧信息,當跳轉到那個ring,就將其堆棧抽取出來賦給 ss 和 sp; 參見 http://blog.csdn.net/PacosonSWJTU/article/details/48657053
總結
以上是生活随笔為你收集整理的特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: A20地址线问题
- 下一篇: aspx服务器怎么配置(aspx服务器怎