提炼:
可以 不使用 调用门(低特权级跳转到高特权级) 和 TSS任务状态段(高特权级跳转到低特权级) 的情况下 做代码段之间的跳转(特权级切换),所使用的就是保护模式下对于代码段特权级保护的依据,即 一致性代码段 与 非一致性代码段的规则。
1 对于非一致性代码段,只能同级转移
其他同特权级代码段(不限一致或非一致) -----跳转到—> 当前非一致性代码段
2 对于一致性代码段,支持低特权级到高特权级一致性代码段的转移,但是!!! 但是转移之后 CPL不变!!!
正常通过调用门跳转到高特权级,代码段CPL 会被赋值为当前内存段的DPL ,但是 这里 对于一致性代码段,不适用!!!
其他低(同)特权级代码段 -----跳转到—> 当前高特权级一致性代码段
3 特权级降低转移到时候,即执行 retf指令的时候,会触发处理器会对栈段特权级的检查,直接通过选择子中的RPL 进行检查,具体就是 SS的选择子请求特权级RPL 要等于 代码段的选择子请求特权级RPL
4 一致性代码段可以直接跳转到其他同级非一致性代码段执行
一致性代码段与非一致性代码段 中的代码没有本质区别,这两种代码段仅仅是跳转时使用的合法性判断规则不同,因此,一致性代码段到非一致性代码段的直接同级跳转是合法的

系统段与非系统段的区分就是看 段描述符内存结构中 高32位的第12位,注意这里所说的系统段与非系统端 指的并不是操作系统,而是处理器本身,比如系统段 具体一点就是 局部段描述附表,TSS任务状态段等,特点就是 处理器需要他们来完成一些关键的功能,如 LDT与TSS是多任务实现的基础,因此他们是系统段
而非系统段 指的就是通常定义的 代码段与数据段,对于代码段而言,又分为 一致性代码段与非一致性代码段
段描述符内存结构中 Type字段: 高32位的第8 - 11 位,判断是不是一致性代码段就是 C位的值

这里的跳转不借助于 调用门描述符!!!
一致性代码段与非一致性代码段 之间的差异 主要体现在代码段之间进行跳转的时候
如果想要跳转到非一致性代码段,必须满足 一下两个条件:
CPL == DPL 当前代码段可执行特权级 == 目标内存段特权级
RPL <= DPL 目标内存选择子请求特权级要高于目标内存特权级
即平级跳转
如果想要跳转到 一致性代码段,那么就只支持从 低(同)特权级的代码 向 高特权级的一致性代码段转移,也就是说 成功跳转的条件是 CPL >= DPL, 即当前代码段可执行特权级 低于或等于 目标内存段特权级,表面看,这个是很厉害的,在不借助调用门描述符的情况下,直接从低特权级跳转到高特权级,虽然能直接跳转,但是,但是,但是 跳转后CPL特权级不会发生改变。比如,当前想从特权级为1的代码段 跳转到 特权级为0 的一致性代码段 那么在我们跳转过去之后,CPL并不会自动等于 当前内存段特权级0,而是依旧是1,不会发生变化!!!

本文详细探讨了在保护模式下代码段之间的跳转规则,特别是特权级切换。非一致性代码段仅支持同级转移,而一致性代码段允许低特权级到高特权级的跳转,但CPL特权级不会改变。实验展示了如何通过直接跳转实现这些转换,验证了特权级管理和代码段切换的机制。内容涉及GDT、段描述符、CPL、DPL和RPL等概念。
最低0.47元/天 解锁文章

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



