阅读 SYSENTER 指令的描述,我发现了以下内容:
IA32_SYSENTER_CS
包含环 0 代码段 (CS)
我以为64位系统现在使用虚拟内存地址方案(分页),基本上不再依赖代码段(CS)寄存器。IA32_SYSENTER_CS
有人可以解释一下注册表中究竟包含什么吗?
有两件事:
首先,段寄存器仍然用于 64 位长模式。如英特尔架构手册(系统编程指南;第 3.2.4 节,“IA-32e 模式中的分段”)中所述:
在 64 位模式下,通常(但不完全)禁用分段,创建一个平坦的 64 位线性地址空间。处理器将 CS、DS、ES、SS 的段基数视为零,创建一个等于有效地址的线性地址。FS 和 GS 段是例外。这些段寄存器(保存段基址)可用作线性地址计算中的附加基址寄存器。它们有助于寻址本地数据和某些操作系统数据结构。
fs
并gs
提供基址;其他段寄存器仅用于查找访问权限。因此,如果cs
包含 value 0x20
,则您处于 ring 0 特权模式;如果它包含0x33
,则您处于 ring 3 模式。
第二件事是sysenter
最初是为 32 位模式设计的。甚至所有 64 位模式的 CPU 都不支持该指令(特别是 AMD 芯片不支持它)。为了获得最大的兼容性,在 64 位长模式下运行的内核将使用syscall
和sysret
指令。