16

在阅读英特尔手册时,我遇到了以下问题:

在支持 Intel 64 架构的处理器上,IA32_SYSENTER_ESP字段和IA32_SYSENTER_EIP字段必须各自包含一个规范地址。

什么是“规范地址”?

4

3 回答 3

19

我建议您下载完整的软件开发手册。该文档以单独的卷提供,但该链接在一个巨大的 PDF 中为您提供了所有七卷,这使得搜索内容变得更加容易。

答案在第 3.3.7.1 节。该部分的第一行指出

在 64 位模式下,如果地址位 63 到微架构实现的最高有效位被设置为全 1 或全零,则地址被认为是规范形式的。

它从那里继续...

您可以使用cpuid查询该 CPU 上支持的虚拟地址宽度。(即“由微架构实现”。)或者您通常可以假设为 48 位。


即一个规范的虚拟地址是 48 位正确符号扩展为 64。如果高位不匹配,它是非规范的,如果你试图取消引用它会出错。

(或者使用 Intel 即将推出的 5 级页表扩展,57 位符号扩展为 64)。

于 2014-09-15T16:28:27.053 回答
8

这个答案不如以前的答案那么详细,但恕我直言更容易理解:

虽然 64 位处理器具有 64 位宽的寄存器,但系统通常不会实现所有 64 位寻址(16 EB 的理论物理内存)。

因此,大多数体系结构定义了处理器将认为无效的地址空间的未实现区域。x86-64 (...) 定义地址的最高有效位,然后必须对其进行符号扩展 (...) 以创建有效地址。这样做的结果是,总地址空间被有效地分为两部分,上部分和下部分,中间的地址被认为是无效的。(...) 有效地址被称为规范地址(无效地址是非规范地址)。

来自https://www.bottomupcs.com/virtual_memory_is.xhtml

Sign-extended是相同位的最高有效位复制到高位地址。上是11111...00000...

于 2019-09-27T10:21:21.833 回答
4

英特尔手册的第 3.3.7.1 节包含 5 个(难以理解)段落,对我来说,这是第 4 卷集的第 74 页,您可以从英特尔网站下载或直接访问:https ://software.intel.com/站点/默认/文件/托管/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf

这些段落所说的是规范地址不是完整的 64 位地址。寻址有不同的实现方式,例如 48 位或 57 位。(57 位需要额外级别的页表,增加了页面遍历的成本。请参阅https://en.wikipedia.org/wiki/Intel_5-level_paging了解有关可以禁用的这个新 CPU 功能的更多信息)。


48 位实现将具有高半规范地址,从

0xFFFF800000000000

而下半部分将是

0x00007FFFFFFFFFFF

如果您看到全 1 或全 0,则第 63 位将表示它为规范地址。在 57 位实现中,当我看到 0xFF____ 或 0x00____ 时,我会立即知道我正在查看规范地址。(高位字节的低位是重要的地址位,其他7个是它的副本:即正确符号扩展)

也许一个有助于记住这一点的方法是规范这个词本身意味着与一般规则或做某事的方式有关。一般来说,没有人需要 64 位所能提供的那么多地址,所以一般不使用它们。此外,如果某件事是根据《星际迷航》或漫画书中的经典设定的,那么这就是最初看到或完成事物的方式。

现在回答为什么我们有规范地址?没有人需要寻址高达 16 艾字节(64 位机器的理论限制),因此该手册的第二段只是说英特尔架构“定义”了一个 64 位线性地址,但看起来没有人会使用它。现在以防万一,第三段说实现仍将检查前几位,如果不是规范形式,则生成“一般保护”异常。

检查规范地址而不是默默地忽略高位的主要原因是确保软件与支持更多虚拟地址位的未来硬件向前兼容。

于 2019-04-21T16:49:39.800 回答