orange's学习--特权级检查

本文详细介绍了处理器的段保护机制,包括4个特权级的概念及其应用,以及在数据段访问和代码段间控制转移时如何进行特权级检查。特权级检查确保了程序的安全性和稳定性,防止低权限代码非法访问高权限资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------------------------------------------------------------
处理器的段保护机制可以识别4个特权级(或特权层),0级到3级。数值越大,特权越小。
在IA32的分段机制中,特权级总共有4个特权级别,从高到低分别是0、1、2、3。数字越小表示的特权级越大。
由于数字越大表示的特权级越小,所以有时为避免混淆,也将高特权级称做内层,而把低特权级称做外层。
环中心(保留给最高级的代码、数据和堆栈)用于最紧要软件的段,通常用于操作系统核心部分;中间两个换用于较为紧要的软件。只使用2个特权级的操作系统应该使用特权级0和3。
处理器利用特权级来防止运行在较低特权级的程序或任务访问具有较高特权级的一个段,除非是在受控的条件下。
当处理器检测到一个违反特权级的操作时,它就会产生一个一般保护性异常。


------------------------------------------------------------
当段描述符的段选择子被加载进一个段寄存器时就会进行特权级检查操作,但用于数据访问的检查方式和用于在代码段之间进行程序控制转移的检查方式不一样。
这些检查规则都是为了满足能够实现特权级的操作系统的一些需求而设置死的,例如内核程序和用户程序要分开,内核程序不能被用户程序干扰。


------------------------------------------------------------
访问数据段时的特权级检查  参考资料  https://www.cnblogs.com/ay-a/p/9101935.html
为了访问数据段中的操作数,数据段的段选择符必须被加载进数据段寄存器(DS,ES,FS或GS)或堆栈段寄存器(SS)中。
可以使用指令MOV、POP、LDS、LES、LFS、lGS和LSS来加载段寄存器。
在把一个段选择符加载进段寄存器之前,处理器会进行特权级检查,它会把当前运行程序或任务的CPL、段选择符的RPL和段描述符的DPL进行比较。
只有当段的DPL数值大于或等于CPL和RPL时,处理器才会把选择符加载进段寄存器中。否则就会产生一个一般保护异常,并且不加载段选择符。

当使用堆栈段选择符加载SS寄存器时也会执行特权级检查。这里与堆栈段相关的所有特权级必须与CPL匹配,也即,CPL、堆栈段选择符RPL以及堆栈段描述符的DPL都必须相同。
如果RPL或DPL与CPL不同,处理器就会产生一个一般保护异常。


------------------------------------------------------------
============================================================
代码段之间转移控制时的特权级检查  参考资料  https://www.cnblogs.com/ay-a/p/9141911.html
程序在代码段间的转移方式
对于将程序控制权从一个代码段转移到另一个代码段,目标代码段的选择符必须加载进代码段寄存器CS中。
作为这个加载过程的一部分,处理器会检测目标代码段的段描述符并执行各种限长、类型和特权级检查。
如果这些检查都通过了,则目标代码段选择符就会加载进CS寄存器,于是程序的控制权就被转移到新的代码段中,程序将从EIP寄存器指向的指令处开始执行。

程序的控制转移指令JMP、RET、CALL和IRET以及异常和中断机制来实现。异常和中断是一些特殊实现。JMP和CALL指令可以利用以下四种方法之一来引用另外一个代码段:
目标操作数含有目标代码的段选择符。
目标操作数指向一个调用门描述符,而该描述符中含有目标代码段的选择符。
目标操作数指向一个TSS(任务状态段),而该TSS中含有目标代码段的选择符。
目标操作数指向一个任务门,该任务门指向一个TSS,而该TSS中含有目标代码段的选择符


------------------------------------------------------------
目标操作数含有目标代码的段选择符:
JMP、CALL和RET指令的近转移形式只是在当前代码段中执行程序控制转移,因此不会执行特权级检查。
JMP、CALL或RET指令的远转移形式会把控制转移到另外一个代码段中,因此处理器一定会进行特权级检查。
当不通过调用门把程序控制权转移到另一个代码段时,处理器会验证4种特权级和类型信息。

处理器检查CPL、RPL和DPL的规则依赖于一致性标志C的设置状态。 
当访问非一致代码段时(C=0),调用者的CPL必须等于目的代码段的DPL,否则将会产生一般保护异常。
执行非一致代码段的段选择符的RPL对检查所起的作用有限。RPL在数值上必须小于或等于调用者的CPL才能使得控制转移成功完成。当非一致代码段的段选择符被加载进CS寄存器中时,特权级字段不会改变,即它仍然是调用者的CPL。即使段选择符的RPl与CPl不同,这也是正确的。

当访问一致代码段时(C=1),调用者的CPL可以在数值上大于或等于目的代码段的DPL。仅当CPL<DPL,处理器才会产生一般保护异常。对于访问一致代码段,处理器忽略对RPL的检查。对于一致代码段,DPL表示调用者对代码段进行成功调用可以处于的最低数值特权级。当程序控制被转移到一个一致代码段中,CPL并不改变,即使目的代码段的DPL在数值上小于CPL。
这是CPL可能与当前代码段DPL不相同的唯一一种情况。同样,由于CPL没有改变,因此堆栈也不会切换。


------------------------------------------------------------
目标操作数指向一个调用门描述符:
为了对具有不同特权级的代码段提供受控的访问,处理器提供了称为门描述符的特殊描述符集,共有四种描述符:
调用门(Call Gate),类型 TYPE=12;
陷阱门(Trap Gate),类型 TYPE=15;
中断门(Interrupt, Gate),类型 TYPE=14;
任务门(Task Gate),类型 TYPE=5.

任务门用于任务切换,陷阱门和中断门时调用门的特殊类,专门用于调用异常和中断的处理程序。
调用门用于在不同特权级之间实现受控的程序控制转移。
他们通常仅用于使用特权级保护机制的操作系统中。

CALL指令和JMP指令的特权级检查规则(调用门)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值