首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >x86-64标准地址?

x86-64标准地址?
EN

Stack Overflow用户
提问于 2014-09-15 16:11:44
回答 3查看 9.3K关注 0票数 19

在阅读一本Intel手册时,我遇到了以下情况:

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

什么是“规范地址”?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-15 16:28:27

我建议你下载软件开发人员手册。文档可以在单独的卷中获得,但该链接为您提供了一个大规模PDF中的所有七个卷,这使得搜索东西变得更加容易。

答案见第3.3.7.1节。这一节的第一行是

在64位模式下,如果微体系结构将地址位63至最重要的实现位设置为所有1或所有零,则该地址被视为规范形式。

从那以后..。

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

也就是说,一个规范的虚拟地址是48位正确的符号-扩展到64。如果高位不匹配,它是非规范的,如果你试图取消引用它会有错误。

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

票数 22
EN

Stack Overflow用户

发布于 2019-09-27 10:21:21

这个答案比以前的答案要详细得多,但IMHO更容易理解:

虽然64位处理器有64位宽寄存器,但系统通常不会实现所有64位的寻址(16艾字节的理论物理内存)。 因此,大多数体系结构定义了一个未实现的地址空间区域,处理器将认为该区域无效。x86-64 (.)定义地址中最重要的有效位,然后必须进行符号扩展(.)若要创建有效地址,请执行以下操作。这样做的结果是,总地址空间被有效地分为两个部分,一个上部分和一个下部分,地址之间被认为是无效的。(...)有效地址被称为规范地址(无效地址为非规范地址)。

来自is.xhtml

Sign-extended是相同位,最重要的位被复制到上层位地址。上部为11111...,下为00000...

票数 11
EN

Stack Overflow用户

发布于 2019-04-21 16:49:39

“英特尔手册”第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位需要额外级别的页表,增加页面遍历的成本。有关这个可以被禁用的新CPU功能的更多信息,请参见寻呼 )。

一个48位的实现将有一个较高的半规范地址,从

0xFFF8000000000

而下半部将会是

0x00007FFFFFFFFFF

如果你看到所有的1或所有的零,那么第63位将作为一个规范地址来表示。在一个57位的实现中,当我看到0xFF____或0x00____时,我会立即知道我在查看一个规范地址。(顶部字节的低位是一个重要的地址位,其余7个是它的副本:即正确地签名扩展)

也许记住这一点的一种有用的方法是,规范一词本身就意味着与一般规则有关,或者是做某事的方式。一般来说,没有人需要像64位所能提供的那样多的地址,所以它们通常不被使用。此外,如果某些东西是按照经典,如“星际迷航”或漫画书,这是看到或做的事情最初的方式。

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25852367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档