【问题标题】:Behind Windows x64's 44-bit virtual memory address limitWindows x64 的 44 位虚拟内存地址限制背后
【发布时间】:2011-06-01 14:07:03
【问题描述】:

http://www.alex-ionescu.com/?p=50

我阅读了上面的帖子。作者通过单链表示例解释了为什么 Windows x64 只支持 44 位虚拟内存地址。

struct {  // 8-byte header
        ULONGLONG Depth:16;
        ULONGLONG Sequence:9;
        ULONGLONG NextEntry:39;
} Header8;

要做的第一个牺牲是减少序列的空间 数字改为 9 位而不是 16 位,减少了最大序列 列表可以达到的数量。这仍然只剩下 39 位 指针 — 对 32 位的普通改进。通过强制 分配时结构为 16 字节对齐,可以多 4 位 赢了,因为现在可以始终假定底部位为 0。


哦,我不明白。

什么“通过在分配时强制结构为 16 字节对齐,可以再赢得 4 位,因为现在可以始终假定底部位为 0。”方法?

【问题讨论】:

  • 我喜欢让我大吃一惊的问题。学习新东西总是很好。

标签: windows memory x86-64 memory-alignment virtual-address-space


【解决方案1】:
16 is 0010000 in binary

32 is 0100000 in binary

64 is 1000000 in binary

您可以看到,对于所有 16 的倍数的数字,最后四位始终为零。 因此,您可以不用存储这些位,而是在需要使用指针时将它们添加回来。

【讨论】:

    【解决方案2】:

    对于一个 2^N 字节对齐的指针,它的地址总是可以被 2^N 整除——这意味着低 N 位总是为零。您可以在其中存储其他信息:

    encode ptr payload = ptr | payload
    decode_ptr data = data & ~mask
    decode_payload data = data & mask
    

    其中掩码为(1 << N) - 1 - 即设置了低 N 位的数字。

    这个技巧通常用于在低级代码中节省空间(有效负载可以是 GC 标志、类型标记等)

    实际上,您存储的不是指针,而是可以从中提取指针的数字。当然,要注意不要在没有解码的情况下将数字作为指针解引用。

    【讨论】:

      猜你喜欢
      • 2018-07-09
      • 1970-01-01
      • 2023-03-17
      • 2021-07-25
      • 1970-01-01
      • 2014-05-28
      • 2012-03-21
      • 1970-01-01
      • 2014-09-06
      相关资源
      最近更新 更多