特权级:0,1,2,3级。
每个任务的每个特权级下只能有一个栈,一个任务最多有四个栈对应四个特权级。
特权级转移:
- 由中断门,调用门等手段实现由低特权级向高特权级转移
- 调用返回指令,这是唯一一种能降低特权级的情况
当处理器从低特权级向高特权级转移时,会自动的把当时低特权级的SS 和 ESP 压入 转移后的高特权级的栈中,最后可以实现“向外层转移”。
TSS简介:Task State Segment
104多个字节,由硬件支持的数据结构,由TR寄存器加载的(类似于基地址)。
其中留有了三个栈。
--------------------------------------------------------------------------
CPL和DPL入门
DPL RPL CPL
处理器的当前特权级是CS寄存器中的选择子的低2位的值,CS.RPL
DPL:段描述符寄存器中的特权级。
CPL:当前CPU执行的指令的代码段的特权级。
RPL:选择子的低2位。
访问者是代码段中的指令,DPL是段描述符所在内存区域的门槛权限。
- 对于受访者为数据段:只有访问者的权限大于等于该DPL表示的最低权限才能够访问。
- 对于受访者为代码段:只有访问者的权限等于该该DPL才能访问,只能平级访问。
一致性代码段:如果自己是转移后的目标段,自己的特权级一定要大于等于转移前的CPL。在数值上CPL>=一致性代码段的DPL。规定了上限。转移后并不会将CPL用该目标段的DPL替换。低特权级访问到了高特权级的代码。
--------------------------------------------------------------------------
门
四种门:任务门,中段门,陷阱门,调用门。
进入了这种神奇的门,处理器便能转移到更高的特权级上。
除了任务门,其他三种门都对应了一段例程,而不像段描述符对应的是一片内存区域。这三种门里面记录了选择子和偏移量。调用门和任务门描述符存于GDT中。中断门,陷阱门存于IDT中不能主动调用。
- 调用门:call jmp 后接调用门选择子。call 可以实现从低特权级向高特权级转移,jmp 只能是平级转移。
- 中断门
- 陷阱门
- 任务门
门的作用相当于蹦床。人站在台子上,往蹦床上跳,人会被弹的比台子还高。台子的高度介于蹦床和目标高度之间。
门槛是访问者的下限,访问者的特权级不能低于门描述符的特权级,否则连门都进不去,门框是访问者特权级的上限,访问者的特权级不能高于门描述符中目标所在代码段的DPL。
进门之后将目标代码段DPL作为CPL,“一步登天啦”!
调用门的时候会涉及到特权级的转换所以要实现一些传参数,压栈操作,旧栈新栈等。
返回时要检查数据段寄存器,如果某个寄存器中选择子对应的DPL权限比返回后的CPL高,将其填充0,引发异常。禁止用户可能访问到内核读数据段。
--------------------------------------------------------------------------
RPL的前世今身
仅靠CPL和DPL存在潜在的危险。
- 比如读文件,要在0特权级下执行,如果用户有非法企图,将参数--缓冲区所在的数据段的选择子用内核的选择子替代!!!就会破坏内核。
- 又或者某个调用门实现类似memcopy的功能,将数据源的选择子用内核的选择子替代,这等于内核完全暴露。
RPL提供了解决
CPL和RPL不一定是对某一个程序而言的。
以后再请求某特权级为DPL的资源时,要求:CPL和RPL的特权级要同时大于等于受访者的特权DPL。CPL<=DPL && RPL <=DPL
RPL代表了真正请求者的特权级。如果用户提供了选择子作为参数,选择子中的RPL会被替换为用户进程的CPL。
- 非一致性代码段:要求CPL=RPL=DPL
- 一致性代码段:CPL>=DPL && RPL >=DPL
- 数据段:CPL<=DPL && RPL <=DPL
- 调用门:DPL_GATE>=CPL>=DPL_CODE && RPL<=DPL_GATE
完结。
标签:调用,CPL,--,精讲,深入浅出,代码段,RPL,DPL,特权 From: https://www.cnblogs.com/wuyun--wy/p/16948186.html