我可以将一些指针 (x86_64) 用于自定义数据吗?如果可能的话怎么办?

Can I use some bits of pointer (x86_64) for custom data? And how if possible?

来自$ cat /proc/cpuinfo | grep address

address sizes   : 39 bits physical, 48 bits virtual
address sizes   : 39 bits physical, 48 bits virtual

所以,根据我的计算,指针大小是 64 位。 48bits用来计算物理地址,还有16bits没用

这些免费的16位可以安全使用吗?

如果是,那么他们是哪些?如何使用它们?我是否总是需要对地址或其他内容进行位掩码?

免责声明:我正在为我将要编写的编程语言设计低级约定。我需要用一些指针传递一个额外的小信息,如果可能的话我想把它压缩成指针。

体系结构支持 64 位寻址,但当前的 CPU 不支持。您只能使用 48 位进行寻址,所以不,您不能使用那 16 位。当然,我们在这里谈论的是物理地址。对于虚拟地址,您确实可以使用 64 位寻址。

If yes, then which are they? And how can they be used? Do I always have to bitmask the address, or something else?

它们是最重要的。我不知道你为什么需要位掩码任何东西。只是不要使用那些位。

Related question

在当前的体系结构中,指针的最低 48 位由 CPU 使用,您可以随意使用 16 位最高有效位。您所要做的就是在取消引用指针之前将它们屏蔽掉,这样就没问题了。

在我熟悉的每个 OS 中,用户模式的第 47 位为 0,因此任何用户模式指针的最高有效 17 位都为 0。这意味着一个简单的位掩码操作将将您的自定义数据变成一个指针。如果您的指针是 8 字节对齐的,那么您可以使用额外的 3 个低位,从而为您提供 20 个自由位供您随意使用。

如果您不知道您的指针是否会设置其高位,您可以将指针存储在最高有效位并进行算术右移以将自定义值转换为规范指针。

换句话说,使用指针中未使用的位是绝对安全的。您只需要遵循两条规则:

  1. 从不 使用超过允许的位数。如果 OS 表示 48 bits virtual,则表示您只能使用高 16 位。如果有一天一个新的 CPU 变成 50 bits virtual,你将只有 14 位。

  2. 解引用时始终生成规范指针。这意味着最高 16 位必须与第 17 位完全相同。如果你有 50 bits virtual,你必须确保最高 14 位与第 15 位相同。