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

kra*_*mir 3 pointers

来自$ cat /proc/cpuinfo | grep address

address sizes   : 39 bits physical, 48 bits virtual
address sizes   : 39 bits physical, 48 bits virtual
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Gab*_*abe 5

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

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

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

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

  1. 切勿使用超出允许的位数。如果操作系统显示48 bits virtual,则意味着您只能使用高16位。如果某天有一个新的CPU表示50 bits virtual,则您只有14位。

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

  • PML5 允许 57 位虚拟地址(额外级别的页表)。我想 Ice Lake CPU 就有这个功能。因此,目标是使用高 8 位(如果您想假设用户空间地址的最高有效位已清零),否则使用高 7 位。如果您只弄乱了高 7 或 8 位,请重做符号或零扩展分别适用于 48 位系统。 (2认同)