来自$ 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位吗?
如果是,那他们是谁?以及如何使用它们?我是否总是需要对地址或其他内容进行位掩码?
免责声明:我正在为将要制定的编程语言设计低级约定。我需要传递一些指针的额外微小信息,如果可能的话,我想将其压缩为指针。
在当前体系结构中,CPU使用的指针的最低有效48位,使您可以随意使用16个最高有效位。您所要做的就是在取消引用指针之前将其屏蔽掉,这样就可以了。
在我熟悉的每个OS中,用户模式的位47为0,因此任何用户模式指针的最高有效位17都为0。这意味着简单的位掩码操作会将您的自定义数据转换为指针。如果指针将对齐8个字节,则您可以使用另外3个低位,从而可以随意使用20个空闲位。
如果您不知道指针是否将其高位设置,则可以将指针存储在最高有效位中,并进行算术右移以将自定义值转换为规范指针。
换句话说,在指针中使用否则未使用的位绝对安全。您只需要遵循两个规则:
切勿使用超出允许的位数。如果操作系统显示48 bits virtual
,则意味着您只能使用高16位。如果某天有一个新的CPU表示50 bits virtual
,则您只有14位。
解除引用时始终生成规范的指针。这意味着最高的16位必须全部与第17位相同。如果您有50 bits virtual
,则必须确保最高的14位与第15位的最高位相同。