NaN 装箱和标记指针在 64 位平台上有未来吗?

Ask*_*aga 7 language-agnostic 64-bit pointers x86-64 arm64

在 x86-64 和 arm64 等常见的 64 位架构上,通常只有 48 位用于内存寻址,而其他位是第 47 位的副本(对于用户空间程序,该位通常为零)。因此,剩余的 16 位可用于存储附加数据,如类型标签等,只要这些位在取消引用之前被屏蔽即可。或者,48 位可以适合 64 位浮点数的 NaN 表示形式。动态/解释语言经常使用这两种技术。

我读过有关 Intel 5 级分页的信息,它将地址范围从 48 位扩展到 57 位,从而显着减少剩余位,并且使 NaN 装箱变得不可能。Linux 内核已经添加了对此分页方案的支持。

鉴于 48 位对应于 262,144 GiB 内存,我们可以假设我们很快就不会在 PC、笔记本电脑和手机等消费设备上需要 57 位范围,因此人们可能会假设在这些设备上我们将保留在 48 位上位模式将在未来很长一段时间内出现,上述技术仍然可行,而 57 位模式将仅用于服务器/超级计算机。

我的这些假设正确吗?或者是否有迹象表明消费级设备在不久的将来也会使用 57 位模式?

Pet*_*des 1

即使内存映射持久存储 (NV-DIMM) 变得普遍,消费者 PC 还需要一段时间才能拥有超过 64TiB 或 128TiB 的存储 + DRAM。请记住,高半内核需要一半的虚拟地址空间供内核使用,并且通常希望将所有物理内存直接映射到虚拟地址的位连续范围。 我认为,以及在内核空间中进行其他映射。例如,请参阅https://www.kernel.org/doc/Documentation/x86/x86_64/mm.txt了解 Linux 的功能。

正如您所怀疑的,操作系统实际上不会在物理地址空间远小于 256TiB 的计算机上启用 PML5。不需要那么多的虚拟地址空间,并且会产生性能成本(来自另一级页表的更昂贵的页面遍历)。页面遍历硬件并不总是能够缓存两个实际使用的顶级条目;CR3 更改上的所有内容失效可能会强制刷新。(页面遍历硬件通常可以缓存基数树的上层,以加快附近页面的 TLB 未命中速度。)