NaN 装箱和标记指针在 64 位平台上有未来吗?
Do NaN-boxing and tagged pointers have a future on 64bit platforms?
在 x86-64 和 arm64 等常见的 64 位架构上,通常只有 48 位用于内存寻址,而其他位是位 47 的副本(对于用户 space 程序通常为零) .因此,剩余的 16 位可用于存储其他数据,如类型标签等,只要这些位在取消引用之前被屏蔽掉即可。或者,48 位可以适合 64 位浮点数的 NaN 表示。 dynamic/interpreted 种语言经常使用这两种技术。
我读过有关 Intel 5 级分页的信息,它将地址范围从 48 位扩展到 57 位,从而显着减少剩余位并使 NaN 装箱成为不可能。 Linux 内核已经添加了对此分页方案的支持。
鉴于 48 位对应于 262,144 GiB 内存,我们可以假设我们很快就不需要在 PC、笔记本电脑和手机等消费设备上使用 57 位范围,因此人们可能会假设在这些设备上我们将在未来很长一段时间内保持 48 位模式,上述技术仍然可行,而 57 位模式将仅用于 servers/supercomputers.
我做出这些假设是否正确?或者是否有迹象表明在不久的将来甚至消费级设备也会使用 57 位模式?
即使内存映射持久存储变得普遍 (NV-DIMM),消费 PC 拥有超过 64TiB 或 128TiB 的存储 + DRAM 还需要一段时间。请记住,high-half 内核需要一半的虚拟地址 space 供内核使用,并且通常希望将所有物理内存直接映射到位连续的虚拟地址范围。 以及 以及在内核中进行其他映射space,我认为。例如请参阅 https://www.kernel.org/doc/Documentation/x86/x86_64/mm.txt 以了解 Linux 的作用。
如您所料,操作系统实际上不会在物理地址远小于 256TiB 的计算机上启用 PML5 space。不需要那么多虚拟地址 space 并且它具有性能成本(来自另一级别页表的更昂贵的页面遍历)。页面遍历硬件并不总是能够将两个实际使用的顶级条目缓存起来; CR3 更改上的所有内容的无效都可以强制刷新。 (页面遍历硬件通常可以缓存基数树的上层以加速附近页面的 TLB 未命中。)
在 x86-64 和 arm64 等常见的 64 位架构上,通常只有 48 位用于内存寻址,而其他位是位 47 的副本(对于用户 space 程序通常为零) .因此,剩余的 16 位可用于存储其他数据,如类型标签等,只要这些位在取消引用之前被屏蔽掉即可。或者,48 位可以适合 64 位浮点数的 NaN 表示。 dynamic/interpreted 种语言经常使用这两种技术。
我读过有关 Intel 5 级分页的信息,它将地址范围从 48 位扩展到 57 位,从而显着减少剩余位并使 NaN 装箱成为不可能。 Linux 内核已经添加了对此分页方案的支持。
鉴于 48 位对应于 262,144 GiB 内存,我们可以假设我们很快就不需要在 PC、笔记本电脑和手机等消费设备上使用 57 位范围,因此人们可能会假设在这些设备上我们将在未来很长一段时间内保持 48 位模式,上述技术仍然可行,而 57 位模式将仅用于 servers/supercomputers.
我做出这些假设是否正确?或者是否有迹象表明在不久的将来甚至消费级设备也会使用 57 位模式?
即使内存映射持久存储变得普遍 (NV-DIMM),消费 PC 拥有超过 64TiB 或 128TiB 的存储 + DRAM 还需要一段时间。请记住,high-half 内核需要一半的虚拟地址 space 供内核使用,并且通常希望将所有物理内存直接映射到位连续的虚拟地址范围。 以及 以及在内核中进行其他映射space,我认为。例如请参阅 https://www.kernel.org/doc/Documentation/x86/x86_64/mm.txt 以了解 Linux 的作用。
如您所料,操作系统实际上不会在物理地址远小于 256TiB 的计算机上启用 PML5 space。不需要那么多虚拟地址 space 并且它具有性能成本(来自另一级别页表的更昂贵的页面遍历)。页面遍历硬件并不总是能够将两个实际使用的顶级条目缓存起来; CR3 更改上的所有内容的无效都可以强制刷新。 (页面遍历硬件通常可以缓存基数树的上层以加速附近页面的 TLB 未命中。)