4

阅读 SYSENTER 指令的描述,我发现了以下内容:

IA32_SYSENTER_CS包含环 0 代码段 (CS)

我以为64位系统现在使用虚拟内存地址方案(分页),基本上不再依赖代码段(CS)寄存器。IA32_SYSENTER_CS有人可以解释一下注册表中究竟包含什么吗?

4

1 回答 1

4

有两件事:

首先,段寄存器仍然用于 64 位长模式。如英特尔架构手册(系统编程指南;第 3.2.4 节,“IA-32e 模式中的分段”)中所述:

在 64 位模式下,通常(但不完全)禁用分段,创建一个平坦的 64 位线性地址空间。处理器将 CS、DS、ES、SS 的段基数视为零,创建一个等于有效地址的线性地址。FS 和 GS 段是例外。这些段寄存器(保存段基址)可用作线性地址计算中的附加基址寄存器。它们有助于寻址本地数据和某些操作系统数据结构。

fsgs提供基址;其他段寄存器仅用于查找访问权限。因此,如果cs包含 value 0x20,则您处于 ring 0 特权模式;如果它包含0x33,则您处于 ring 3 模式。

第二件事是sysenter最初是为 32 位模式设计的。甚至所有 64 位模式的 CPU 都不支持该指令(特别是 AMD 芯片不支持它)。为了获得最大的兼容性,在 64 位长模式下运行的内核将使用syscallsysret指令。

于 2017-06-21T05:13:12.087 回答