x86-64规范地址?

时间:2014-09-15 16:11:44

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

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

  

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

什么是规范地址'?

3 个答案:

答案 0 :(得分:6)

我建议您下载full software developer's manual。该文档在单独的卷中提供,但该链接为您提供了一个大型PDF中的所有七个卷,这使得搜索更容易。

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

  

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

从那里开始......

答案 1 :(得分:3)

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

  

尽管64位处理器具有64位宽的寄存器,但系统通常   不要实现所有64位寻址(16艾字节的   理论物理记忆)。

     

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

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

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

答案 2 :(得分:1)

与user3386109一样,第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位或56位。

一个48位的实现将从

开始具有高位规范地址

0xFFFF800000000000

而下半部分将是

0x00007FFFFFFFFFFF

就像手册中所说的那样,如果您看到全1或全0,则第63位将表示其为规范地址。在56位实现中,当我看到0xFF____或0x00____时,我立即知道我正在查看规范地址。

也许记住这一点的一种有用方法是规范本身一词与一般规则或做事方式有关。我只是以为自己,英特尔过去使用不到64位的地址,所以...这很有意义。另外,如果像《星际迷航》或漫画书中所述的那样符合某些经典,那也是事物最初被看到或完成的方式。

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