系统机制深入解析:段加载、任务状态段与硬件安全
1. 延迟段加载机制
在 x86 和 x64 系统中,DS 和 ES 寄存器的值可能与它们对应环级的定义值不匹配。例如,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)。这种差异是由于延迟段加载特性导致的,它反映了在平坦内存模型下,当当前代码特权级别(CPL)为 0 时,数据段的描述符特权级别(DPL)的无意义性。因为较高的 CPL 总是可以访问较低 DPL 的数据,但反之则不行。如果在进入内核时将 DS 和/或 ES 设置为它们的“正确”值,那么在返回用户模式时也需要恢复这些值。
虽然 MOV DS, 10h 指令看似简单,但处理器的微代码在遇到它时需要执行一系列选择器正确性检查,这会给系统调用和中断处理带来显著的处理成本。因此,Windows 始终使用 Ring 3 数据段值,以避免这些相关成本。
2. 任务状态段(TSS)
除了代码和数据段寄存器外,x86 和 x64 架构还有一个额外的特殊寄存器:任务寄存器(TR),它是一个 16 位的选择器,作为全局描述符表(GDT)中的偏移量。在这种情况下,段条目与代码或数据
超级会员免费看
订阅专栏 解锁全文
84万+

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



