pmtest5.asm
CPL current privilege level
- 存储在cs 和 ss的第0位和第1位上
- CPL通常等于当前所在段的特权级,除非当前所在段是一致代码段
- 所以程序在不同特权级的代码之间切换时CPL也随之变化
- 一致代码段:
- 可以被相同或更低特权级的代码访问。
- 访问的一致代码段特权级特权级与CPL不相同时,CPL不会改变。
DPL descriptor privilege level
- 表示段、门的特权级
- 存储在段描述符、门描述符的DPL字段中
- 当想访问某段或门时 DPL和CPL比较 或DPL与门选择子的RPL比较 符合要求方可访问
- 对不同的段、门DPL的含义不同:
- 数据段:该段的DPL规定了访问此段的最低特权级,即要求DPL>=CPL。例如若DPL=1 则CPL必须<=1才可以访问
- 非一致代码段(不使用调用门访问之) :访问时CPL与RPL必须等于该段的DPL 同时RPL<=DPL
- 调用门、TSS:DPL的含义与数据段的DPL含义一致
- 非一致代码段(使用调用门访问)、一致代码段:要求DPL<=CPL。例如若DPL=2 则CPL为0、1的不可以访问
RPL requested privilege level
- 存储在段选择子的第0和1位
- 转移目标为一致代码段(不使用调用门访问之):RPL不做检查
- 转移目标为非一致代码段(不使用调用门访问之):RPL<=DPL
引入门的原因:不使用门不能进行不同特权级的转移:
- 非一致代码只能在相同特权级转移 ,一致代码段虽然能从低特权级到高特权级代码段转移但是CPL不会变化。
- 引入调用门后可以实现低特权级到高特权的转移 无论代码段是一致的还是非一致的
pmtest5a.asm的主要结构和pmtest2还是很像的,一下是一些比较难理解的代码的解释
-
这里selectorstack3指向的就是ss topofstack3就是esp 意思是我们转移去ring3它的那个堆栈去 然后cs:ip是268和269行处压入栈中,意思是去ring3代码段的开头。因为pmtest5.asm中的ret指令好像都是不会去返回参数的,所以并没有去压入参数,如果有参数的话是要在压入ss\esp之后,压入cs\eip之前压入参数好像,书中50页以后那几页关于堆栈变化的图是这样描述的emmm,书讲的很清楚没有啥需要特别理解的。