将计算机分为两部分,访问者和受访者。访问者的特权级可以变,受访者的特权级不能变。CPU将程序拥有的权利分为四个等级。
TSS简介
TSS是一种数据结构,用于存储任务的环境。TSS中有三个栈,分别记录012三个特权级的地址,在进行特权级转移时,处理器会进入这三个栈寻找地址。
CPL和DPL
CPL是当前CPU所处的特权级,称为当前特权级,它表示处理器正在执行的代码的特权级别。当前特权级存储在CS寄存器的RPL字段中。
DPL是描述符特权级,为受访者标记了特权等级。
访问者在任何时候都不能访问比自己特权更高的资源,无论受访资源是数据还是代码。
一致性代码也称为依从代码段,用来实现低特权级的代码向高特权级的代码转移,但本身并没有提升特权级。
门
门是记录一段程序起始地址的描述符,同段描述符类似,都是8字节的数据结构,用来描述门中通向的代码。可以使用门来进入高特权级。
请求特权级RPL
RPL代表真正资源需求者的CPL,在请求某特权级为DPL的资源时,参与特权检查的不止有CPL,还有RPL。RPL引入的目的是避免低特权级的程序访问高特权级的资源,保护内核。
RPL,CPL,DPL三者关系:
假设当前处理器正在DPL为3的代码段上运行,即正在运行用户程序,故处理器当前特权级CPL为3。此时用户进程想获取安装物理内存大小,该数据存储在操作系统的数据段中,该段DPL为0,由于当前运行的是用户程序,CPL为3,所以无法访问DPL为0的数据段。于是它使用调用门向系统救助。调用门是操作系统安装在全局描述符表GDT中的,为了让用户进程可以使用此调用门,操作系统将该调用门描述符的DPL设为3.该调用门只需要一个参数,就是用户程序用于存储系统内存容量的缓冲区所在数据段的选择子和偏移地址。调用门描述符中记录的就是内核服务程序所在代码段的选择子及在代码段内的偏移量。用户进程用“call调用门选择子”的方式使用调用门,此调用门选择子是由操作系统提供的,该选择子的RPL为3,此时如果用户伪造一个调用门选择子也没用,因为此选择子是用来素引门描述符的并不用来指向缓冲区的选择子,调用门选择子中的高13位索引值必须要指向门描述符在GDT中的位置,选择子中低2位的RPL伪造也没意义,因为此时CPL为3,是短板,以它为主。此时处理器便进行特权级检查,CPL为3,RPL为3,门描述符DPL为3,即数值上(CPL≤DPL&&RPL≤DPL)成立,初步检查通过。接下来还要再将CPL与门描述符中选择子所对应的代码段描述符DPL比较,这是调用门对应的内核服务程序的DPL,为叙述方便将其记作 DPL CODE。由于 DPL CODE是内核程序的特权级,所以DPL CODE为0,CPL为3,即数值上满足CPL≥ DPL CODE,CPL比目标特权级低,检查通过,该用户程序可以用调用门,于是处理器的当前特权级CPL的值用 DPL CODE代替,记录在 CS. RPL中,此时CPL变为0.接下来,处理器便以0特权级的身份开始执行该内核服务程序,由于该服务程序的参数是用户提交的缓冲区所在的数据段的选择子及偏移量,为避免用户将缓冲区指向了内核的数据区,安全起见,在该内核服务程序中,操作系统将这个用户所提交的选择子的RPL变更为用户进程的CPL,也就是指向级冲区所在段的选择子的RPL变成了3.前面说过,参数都是内核在0级中获得的,虽然用户进程将缓冲区的选择子及偏移量压在了3特权级栈中,但由于调用门的特权级变换,参数已经由处理器在固件一级上自动复制到0特权级栈中了。用户的代码段寄存器CS也在特权级发生变化时,由处理器自动压入到0特权级栈中,所以操作系统需要的参数都可以在自己的0特权级栈中找到,用户缓冲区的选择子修改过后,接下来内核服务程序将用户所需要的内存容量大小写到这个选择子和用户提交的偏移量对应的缓冲区。如果用户程序想搞破坏,所提交的这个缓冲区选择子指向的目标段不是用户进程自己的数据段,而是内核数据段或内核代码段,由于目标段的DPL为0,虽然此时己在内核中执行,CPL为0,但选择子RPL已经被改为3,数值上不满足CPL≤DPHL&&RL≤DPL,往缓冲区中的写入被拒绝,处理器引发异常如果用户程序提交的缓冲区选择子确实指向用户程序自己的数据段,DPL则为3,数值CPL≤DPL&RPL≤DPL,往缓冲区中的写入则会成功。如果中断服务程序内部再有访问内核自己内存段的操作,还会按照数(CPL≤DPL&&RPL≤DPL)的策略进行新一轮的特权检测。
标签:CPL,特权,内核,缓冲区,DPL,RPL From: https://www.cnblogs.com/LCAB/p/17046174.html