系统机制深入解析:从段加载到硬件漏洞
1. 懒段加载机制
在 x86 和 x64 系统中,DS 和 ES 寄存器的值有时并不与它们对应环级的定义值相匹配,这一现象源于懒段加载(Lazy segment loading)机制。
1.1 不同模式下的段值差异
以 x86 用户模式线程为例,其段值如下:
- CS = 1Bh (18h | 3)
- ES, DS = 23 (20h | 3)
- FS = 3Bh (38h | 3)
而在 Ring 0 进行系统调用时,段值则变为:
- CS = 08h (08h | 0)
- ES, DS = 23 (20h | 3)
- FS = 30h (30h | 0)
同样,x64 内核模式线程的 ES 和 DS 段也会被设置为 2Bh (28h | 3)。
1.2 懒段加载的原因
这种差异反映了在平坦内存模型下,当当前代码特权级别(CPL)为 0 时,数据段的描述符特权级别(DPL)变得没有意义。因为高 CPL 总是可以访问低 DPL 的数据,但反之则不行。如果在进入内核时将 DS 和/或 ES 设置为“合适”的值,那么在返回用户模式时也需要恢复这些值。而且,虽然 MOV DS, 10h 指令看似简单,但处理器的微代码在遇到它时需要执行一系列选择器正确性检查,这会给系统调用和中断处理带来显著的处理成本。因此,Windows 始终使用 Ring 3 数据段的值,以避免这些相关成本。
2. 任务状态段
除了代码和数据段寄存器外,x86 和 x64 架构还有
超级会员免费看
订阅专栏 解锁全文

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



