CPU TSS硬件实现
- CPU一共分为0,1,2,3四个特权级,操作系统内核为最高特权级0级,用户级别为最低3级
- 由硬件结构TSS来实现,TSS包括不同特权级的栈指针
- 特权转移只能由低特权级向高特权级转移,因此3级TSS有三个栈指针,0级有零个
- TSS结构是需要软件填写内容,指针存储在TR寄存器;切换不同的任务(进程)时会将TR寄存器切换为对应的TSS指针
CPL&DPL&RPL
- X86体系的计算机访问内存的机制都是段基址:偏移地址的方式,不管是实模式还是保护模式
- 保护模式下段寄存器不再是段基址,而是段选择子;段选择子在GDT或者LDT中找到相应的段描述符,在段描述符中获得段的起始地址
- 选择子结构:0-1位RPL,2TI,3-15段描述符索引以及两位DPL
- RPL时请求特权级
- 当前特权级CPL保存在CS选择子的0-1位PRL
谁为代码段寄存器CS赋值?
- 访问者的CPL是转移到访问者程序时选择子的DPL,由操作系统指定,无法伪造
- 被访问者的特权级由段描述符的DPL描述
- 访问者任何时候都不允许访问比自己特权更高的资源,无论受访资源是数据,还是代码
- RPL记录了真正访问者的特权级,CPL记录了当前运行程序的特权级,可能和RPL不是同一个程序(用户程序进行了系统调用)
- 用户程序提供的选择子的前两位都会被置为当前程序的CPL,所以即使用户从程序进行系统调用也无法向内核中写数据,因为操作之前会进行检查,要求选择子的RPL<=段描述符的DPL