将当前特权级CPL(存放在cs寄存器的低两位)
CS里是放的选择子,每个选择子的0和1位就是RPL。选择子放入到CS后,0和1位就是RPL,也即是当前进程的CPL。
如前所述,CPU的当前特权级(CPL)反映了进程是在用户态还是内核态,并由存放在cs寄存器中的段选择符的RPL字段指定。只要当前特权级被改变,一些段寄存器必须相应地更新(如ds和ss寄存器)。例如,当CPL=3时(用户态),ds寄存器必须含有用户数据段的段选择符,而当CPL=0时,ds寄存器必须含有内核数据段的段选择符。ss寄存器也一样,当CPL为3时,它必须指向一个用户数据段中的用户栈,而当CPL为0时,它必须指向内核数据段中的一个内核栈。当从用户态切换到内核态时,Linux总是确保ss寄存器装有内核数据段的段选择符。
总结下,CPL就是跟代码段绑定的,从一个代码段jmp到另外一个代码段时,CPL如果发生变化,则ds,ss等其它权限相关的部分的权限必须相应地跟着变化。
《深入理解Linux内核(第三版)》§2.3 Linux中的分段
理解Linux内核中的CPL与权限管理
本文深入解析Linux内核中的当前特权级(CPL)概念,阐述其如何与段寄存器(CS、SS)交互,以及如何在用户态与内核态之间切换时自动调整权限。主要内容包括CPL的定义、与段寄存器的关系、切换状态时的权限调整策略,以及Linux内核如何确保不同特权级别的进程正确访问资源。
5979

被折叠的 条评论
为什么被折叠?



