Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86-64标准地址?_Assembly_X86 64_Intel_Memory Address_Virtual Address Space - Fatal编程技术网

Assembly x86-64标准地址?

Assembly x86-64标准地址?,assembly,x86-64,intel,memory-address,virtual-address-space,Assembly,X86 64,Intel,Memory Address,Virtual Address Space,在阅读《英特尔手册》的过程中,我遇到了以下问题: 在支持英特尔64体系结构的处理器上,IA32\u syscenter\u ESP字段和IA32\u syscenter\u EIP字段都必须包含规范地址 什么是“规范地址”?我建议您下载。文档分为不同的卷,但该链接将所有七卷都放在一个大型PDF中,这使得搜索内容更加容易 答案见第3.3.7.1节。该部分的第一行说明 在64位模式下,如果地址位63到微体系结构实现的最高有效位被设置为全1或全0,则地址被视为标准形式 从那里开始 您可以使用cpuid

在阅读《英特尔手册》的过程中,我遇到了以下问题:

在支持英特尔64体系结构的处理器上,
IA32\u syscenter\u ESP
字段和
IA32\u syscenter\u EIP
字段都必须包含规范地址


什么是“规范地址”?

我建议您下载。文档分为不同的卷,但该链接将所有七卷都放在一个大型PDF中,这使得搜索内容更加容易

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

在64位模式下,如果地址位63到微体系结构实现的最高有效位被设置为全1或全0,则地址被视为标准形式

从那里开始

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


也就是说,规范虚拟地址是48位,正确地扩展到64位。如果高位不匹配,则它是非规范的,如果您尝试取消引用它,它将出错


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

英特尔手册第3.3.7.1节用5段(难以理解)介绍了这一点,对我来说,这是4卷集的第74页,您可以从英特尔网站下载,也可以直接访问:

这些段落所说的是,规范地址比完整的64位地址小。有不同的寻址实现,例如48位或57位。(57位需要额外级别的页表,这增加了页漫游的成本。有关此可保留禁用的新CPU功能的更多信息,请参阅)


一个48位的实现将有一个从

0xFFFF80000000000

而下半部分则是

0x00007FFFFFFFFF

如果您看到全部1或全部0,则第63位表示它为规范地址。在57位实现中,当我看到0xFF\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。(顶部字节的低位为有效地址位,其他7位为其副本:即正确扩展符号)

也许记住这一点的一个有用方法是,canonical这个词本身意味着与一般规则或做事方式有关。一般来说,没有人需要64位所能提供的地址,因此通常不使用它们。同样,如果某件事是按照《星际迷航》或漫画书中的佳能来做的,那就是事情最初被看到或做的方式

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

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

这个答案没有以前的答案详细,但更容易理解:

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

因此,大多数架构定义了地址的未实现区域 处理器认为无效的空间供使用。x86-64(…) 定义地址的最高有效位,然后 进行符号扩展(…)以创建有效地址。结果呢, 整个地址空间有效地分为两部分, 上部和下部,地址介于两者之间 无效的(…)有效地址称为规范地址(无效) 地址是非规范的)


符号扩展
是复制到高位地址的同一位最高有效位。Upper是
11111…
lower
00000…

我从来没有听说过,但Google给我看了-不知道这是否是你要找的。我猜是一个物理内存地址,而不是一个由页表翻译的地址。@marko:不,规范或非仅适用于虚拟地址。对于4级页面表(),只有足够的空间翻译48位,canonical=正确地扩展到64位。IceLake中有一个扩展,可以添加第五级页表选项,我认为它将虚拟地址空间扩展到57位。对于非易失性DIMM,对巨大虚拟和物理地址空间的需求正在增长。嘿,我刚刚编辑了顶部的答案,添加了一些类似的内容,然后向下滚动查看。仍然投票支持这一点;很好的总结,以及更多细节的有用链接。