x86-64规范地址?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了x86-64规范地址?相关的知识,希望对你有一定的参考价值。
在阅读英特尔手册时,我遇到了以下情况:
在支持Intel 64体系结构的处理器上,
IA32_SYSENTER_ESP
字段和IA32_SYSENTER_EIP
字段必须包含规范地址。
什么是“规范地址”?
我建议你下载full software developer's manual。该文档在单独的卷中提供,但该链接为您提供了单个大型PDF中的所有七个卷,这使得搜索事物变得更加容易。
答案在3.3.7.1节中。该部分的第一行说明
在64位模式中,如果微架构的地址位63到最重要的实现位被设置为全1或全零,则认为地址是规范形式。
它从那里继续......
“英特尔手册”第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功能的更多信息,请参阅https://en.wikipedia.org/wiki/Intel_5-level_paging)。
48位实现将具有从中开始的高半规范地址
0xFFFF800000000000
而下半部分则是
0x00007FFFFFFFFFFF
如果您看到全部或全部为0,则将第63位表示为规范地址。在57位实现中,当我看到0xFF____或0x00____时,我立即知道我正在查看规范地址。 (顶部字节的低位是一个有效的地址位,另外7位是它的副本:即正确的符号扩展)
也许一种有用的方式来记住这一点,规范本身意味着与一般规则或做某事的方式有关。通常,没有人需要64位可以提供的地址,因此通常不使用它们。此外,如果像“星际迷航”或漫画书那样根据佳能,那就是最初看到或完成的事情。
现在回答为什么我们有规范地址?没有人需要解决高达16艾字节(64位机器的理论极限)所以该手册的第二段只是说英特尔架构“定义”了64位线性地址,但看起来没有人会使用它。现在,以防万一,第三段表示实现仍将检查前几位,如果不是规范形式,则生成“一般保护”异常。
检查规范地址而不是静默忽略高位的主要原因是为了确保软件与支持更多虚拟地址位的未来硬件向前兼容。
以上是关于x86-64规范地址?的主要内容,如果未能解决你的问题,请参考以下文章
x86-64 上检查指针范围是不是跨越 N 字节对齐地址的最快方法?
-bash: /usr/bin/ls: /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory(代码片段