x86-64规范地址是什么?

20

在阅读英特尔手册时,我看到了以下内容:

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

什么是“规范地址”?


2
我从未听说过这个,但谷歌给我展示了这个链接(http://en.wikipedia.org/wiki/X86-64#Canonical_form_addresses)- 不知道这是否是你要找的。 - Jesus is Lord
我的猜测是一个物理内存地址,而不是由页表翻译的地址。 - marko
@marko:不,规范化与否仅适用于虚拟地址。使用4级页表(为什么64位的虚拟地址比物理地址短4位(48位长)?),只有足够的空间来翻译48位,规范化=正确地扩展到64位。我认为,将添加第5级页面表选项的扩展将在IceLake中推出,将虚拟地址空间扩大到57位。随着非易失性DIMM的需求增长,对巨大虚拟和物理地址空间的需求也在增加。 - Peter Cordes
3个回答

23

我建议您下载完整的软件开发人员手册。该文档分为多个卷,但此链接可让您在单个大型PDF中获取所有七个卷,从而更易于搜索内容。

答案在第3.3.7.1节中。该节的第一行说明如下:

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

接下来还有一些详细内容...

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


即规范的虚拟地址是48位,正确地符号扩展到64位。如果高位不匹配,则为非规范形式,如果尝试对其进行解引用,则会导致故障。

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


13
这个答案没有前面的那些详细,但我认为更容易理解:
虽然64位处理器具有64位宽的寄存器,系统通常不会实现所有64位以进行寻址(理论物理内存为16 exabytes)。 因此,大多数架构定义了一个未实现的地址空间区域,处理器将认为其无效。x86-64 (...)定义了地址的最高有效位,然后必须将其符号扩展(...)以创建有效地址。这样做的结果是,总地址空间实际上被划分为两个部分,一个上部和一个下部,中间的地址被视为无效。(...)有效地址称为规范地址(无效地址为非规范地址)。
来源: https://www.bottomupcs.com/virtual_memory_is.xhtml Sign-extended是将最高有效位复制到地址的上位位。上位是11111…,下位是00000…

嘿,我刚刚编辑了顶部答案,在向下滚动并看到这个之前添加了类似的内容。仍然给它点赞了;很好的总结,并提供了更多详细信息的链接。 - Peter Cordes

5
英特尔手册第3.3.7.1节中有5个(难以消化的)段落涵盖了这个问题。对于我来说,这是四卷套装中的第74页,您可以从英特尔网站下载或直接前往此处查看。
这些段落所说的是规范地址不是完整的64位地址。有不同的寻址实现,例如48位或57位。(57位需要额外的页面表级别,增加了页面遍历的成本。有关此新CPU功能的更多信息,请参见https://en.wikipedia.org/wiki/Intel_5-level_paging,该功能可以被禁用)
48位实现将具有以0xFFFF800000000000开头的高半规范地址,而低半部分将为0x00007FFFFFFFFFFF。如果您看到所有的1或所有的0,则63位至任何位都表示它为规范地址。在57位实现中,当我看到0xFF____或0x00____时,我会立即知道我正在查看规范地址。(顶部字节的低位是重要的地址位,其他7位都是它的副本:即正确地扩展符号)
也许记住这个有帮助的方式是规范本身意味着与一般规则或做某事的方式有关。一般来说,没有人需要64位可以提供的那么多地址,因此通常不使用它们。此外,如果某些东西是按照规范进行的,如星际迷航或漫画书中的规范,则表明最初的看法或做法。
现在回答为什么我们需要规范地址?没有人需要寻址高达16EB(64位机器的理论极限),因此该手册的第二段仅表示Intel架构“定义”了一个64位线性地址,但看起来没有人会使用它。现在,以防万一,第三段指出,实现仍将检查那些前几位,并且如果不符合规范形式,则生成“通用保护”异常。
检查规范地址而不是默默地忽略上半部分的主要原因是确保软件向前兼容未来支持更多虚拟地址位的硬件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接