阅读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
包含值0x20
,则您处于环 0 特权模式;如果它包含0x33
,则您处于环 3 模式。
第二件事是sysenter
最初是为 32 位模式设计的。该指令甚至不受所有 64 位模式的 CPU 支持(特别是 AMD 芯片不支持它)。为了获得最大的兼容性,在 64 位长模式下运行的内核将使用syscall
和sysret
指令。