我可以使用一些指针(x86_64)位来存储自定义数据吗?如果可能的话怎么办?

2023-11-27

From $ cat /proc/cpuinfo | grep address:

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

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

这些空闲的16位可以安全使用吗?

如果是,那么他们是谁?以及如何使用它们?我是否总是必须对地址进行位掩码,或者其他什么?

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


在当前的架构中,CPU 使用指针的最低有效 48 位,剩下 16 个最高有效位供您随意使用。您所要做的就是在取消引用指针之前将它们屏蔽掉,就可以了。

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

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

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

  1. Never使用比允许的更多的位。如果操作系统说48 bits virtual,这意味着只能使用高 16 位。如果有一天新的 CPU 说50 bits virtual,你只有 14 位。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以使用一些指针(x86_64)位来存储自定义数据吗?如果可能的话怎么办? 的相关文章

随机推荐