【问题标题】:Can I use some bits of pointer (x86_64) for custom data? And how if possible?我可以为自定义数据使用一些指针(x86_64)吗?如果可能的话怎么办?
【发布时间】:2015-10-09 22:26:16
【问题描述】:

来自$ 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 位可以安全使用吗?

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

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

【问题讨论】:

标签: pointers x86-64


【解决方案1】:

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

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

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

Related question

【讨论】:

  • 我知道这些位不用于地址解析。我希望它们用于自定义数据:)
  • 只要在取消引用指针之前屏蔽掉自定义位,就可以随意使用它们。只需确保您使用的位数不超过可用位数,并且您的指针始终是规范的。
【解决方案2】:

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

在我熟悉的每个操作系统中,用户模式的第 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 位相同。

【讨论】:

  • 那么,您是说这些位可安全用于自定义数据? :)
  • CPU 只接受指令并执行它,那么您将在哪里屏蔽和/或提取?此外,正如我已经提到的,这听起来不像是一个聪明的设计,因为操作系统可能会在未来使用这些,与硬件相同。所以最终它会破裂。
  • @Miro:我刚刚编辑了帖子说它是安全的,只要你遵守规则。
  • PML5 允许 57 位虚拟地址(页表的额外级别)。我认为,Ice Lake CPU 拥有它。因此,目标是使用高 8 位(如果您想假设用户空间地址的最高有效位为零),否则使用高 7。如果您只使用高 7 或 8 位,请重做符号或零扩展分别适用于 48 位系统。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2021-11-07
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
相关资源
最近更新 更多