Rou*_*uki 7 assembly x86-64 intel virtual-address-space memory-address
在阅读英特尔手册时,我遇到了以下情况:
*在支持Intel 64体系结构的处理器上,IA32_SYSENTER_ESP字段和IA32_SYSENTER_EIP字段必须包含规范地址.
我不明白'规范地址'的含义......?
很想得到一个解释;)找不到任何东西@ google
谢谢
我建议您下载完整的软件开发人员手册.该文档在单独的卷中提供,但该链接为您提供了单个大型PDF中的所有七个卷,这使得搜索事物变得更加容易.
答案在3.3.7.1节中.该部分的第一行说明
在64位模式中,如果微架构的地址位63到最重要的实现位被设置为全1或全零,则认为地址是规范形式.
它从那里继续......
这个答案不如以前的答案详细,但恕我直言更容易理解:
虽然 64 位处理器具有 64 位宽寄存器,但系统通常不会实现所有 64 位寻址(16 艾字节的理论物理内存)。
Thus most architectures define an unimplemented region of the address space which the processor will consider invalid for use. x86-64 (...) define the most-significant valid bit of an address, which must then be sign-extended (...) to create a valid address. The result of this is that the total address space is effectively divided into two parts, an upper and a lower portion, with the addresses in-between considered invalid. (...) Valid addresses are termed canonical addresses (invalid addresses being non-canonical).
From https://www.bottomupcs.com/virtual_memory_is.xhtml
Sign-extended
is same bit most significant bit copied to the upper bits address. Upper is 11111...
lower 00000...
.
英特尔手册第 3.3.7.1 节用 5 个(难以理解)段落对此进行了介绍,对我来说,这是第 4 卷集的第 74 页,您可以从英特尔网站下载或直接访问此处:https: //software.intel.com/站点/默认/文件/托管/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
而下半部分是
0x00007FFFFFFFFFFFF
如果您看到全 1 或全 0,则第 63 位将表示它是规范地址。在 57 位实现中,当我看到 0xFF____ 或 0x00____ 时,我会立即知道我正在查看规范地址。(最高字节的低位是有效地址位,其他7位是它的副本:即正确的符号扩展)
也许记住这一点的一个有用方法是“规范”这个词本身意味着与一般规则或做某事的方式相关。一般来说,没有人需要与 64 位所能提供的地址一样多的地址,因此一般不使用它们。此外,如果某件事符合《星际迷航》或漫画书中的标准,那么它就是事物最初被看到或做的方式。
现在回答为什么我们有规范地址?没有人需要寻址高达 16 艾字节(64 位机器的理论极限),因此该手册的第二段只是说英特尔架构“定义”了 64 位线性地址,但看起来没有人会使用它。现在以防万一,第三段表示实现仍将检查前几位,如果不是规范形式,则生成“一般保护”异常。
检查规范地址而不是默默地忽略高位的主要原因是为了确保软件与支持更多虚拟地址位的未来硬件向前兼容。
归档时间: |
|
查看次数: |
1687 次 |
最近记录: |