我正在使用一些技巧在指针中存储额外的信息,目前有些位没有在指针中使用(最高 16 位),但这在未来会改变。我希望有一种方法来检测我们是否正在编译或运行在将使用超过 48 位的指针的平台上。
相关内容: Why can't OS use entire 64-bits for addressing? Why only the 48-bits? http://developer.amd.com/wordpress/media/2012/10/24593_APM_v2.pdf
x86-64、Windows、C/C++ 需要解决方案,最好是可以在编译时完成的解决方案。 其他平台的解决方案也很有趣,但不会标记为正确答案。
最佳答案
IMAGE_FILE_LARGE_ADDRESS_AWARE
对于这两种类型,省略它会将程序限制在较低的 2 GB 地址空间,严重减少应用程序可以映射的内存,从而降低地址空间布局随机化(ASLR,一种攻击缓解机制)的有效性).
不过它有一个好处,这正是您想要的:只能设置指针的低 31 位,因此可以通过 int
(32位整数、符号或零扩展)。
在运行时情况稍微好一些:
只需使用来自 intel 的 cpuid
指令,函数 EAX=80000008H,并从位 8-15 读取虚拟地址的最大使用地址位数。
操作系统不能使用超过 CPU 支持的数量,请记住英特尔坚持规范地址(符号扩展)。
请参阅此处了解如何使用 C++ 中的 cpuid
:CPUID implementations in C++
关于c++ - 如何确定我们使用的是真正的 48、56 还是 64 位指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26140029/