【问题标题】:x86-64 canonical address?x86-64 规范地址?
【发布时间】:2014-11-09 05:38:00
【问题描述】:

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

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

什么是“规范地址”?

【问题讨论】:

  • 我从未听说过,但 Google 向我展示了 this - 不知道这是否是您想要的。
  • 我的猜测是物理内存地址,而不是页表翻译的地址。
  • @marko:不,规范或不仅适用于虚拟地址。使用 4 级页表 (Why in 64bit the virtual address are 4 bits short (48bit long) compared with the physical address (52 bit long)?),只有足够的空间来转换 48 位,并且 canonical = 正确符号扩展为 64。IceLake I 中将添加一个添加第 5 级页表选项的扩展想想,将虚拟地址空间扩大到 57 位。使用非易失性 DIMM,对巨大的虚拟和物理地址空间的需求正在增长。

标签: assembly x86-64 intel memory-address virtual-address-space


【解决方案1】:

我建议你下载full software developer's manual。该文档以单独的卷提供,但该链接在一个巨大的 PDF 中为您提供了所有七卷,这样可以更轻松地搜索内容。

答案在第 3.3.7.1 节。该部分的第一行说明

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

从那里继续……

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


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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 嘿,我刚刚编辑了最佳答案以添加类似的内容,然后向下滚动并看到这个。仍然对此表示赞同;很好的总结,以及指向更多细节的有用链接。
    【解决方案3】:

    英特尔手册的第 3.3.7.1 节包含 5 个(难以理解)段落,对我来说,这是第 4 卷集的第 74 页,您可以从英特尔网站下载或直接访问:https://software.intel.com/sites/default/files/managed/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 位线性地址,但看起来没有人会使用它。现在以防万一,第三段说实现仍将检查前几位,如果不是规范形式,则生成“一般保护”异常。

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

    【讨论】:

      猜你喜欢
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 2014-02-15
      相关资源
      最近更新 更多