【问题标题】:How to find out if we are using really 48, 56 or 64 bits pointers如何确定我们使用的是真正的 48、56 还是 64 位指针
【发布时间】:2014-11-26 05:09:16
【问题描述】:

我正在使用技巧将额外信息存储在指针中,目前指针中未使用某些位(最高 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++ 需要该解决方案,最好是可以在编译时完成的解决方案。 其他平台的解决方案也很有趣,但不会标记为正确答案。

【问题讨论】:

  • 目前我在调试模式下断言检查从 malloc 返回的指针是否使用不超过 48 位,但这些断言在发布时被关闭。我想要一个在启动或编译时进行检查的解决方案。
  • 如果您想对处理器功能进行编译时测试,请使用 cpuid 80000008H,请参阅英特尔手册。
  • 您的应用程序需要多少内存?小于 2GB?
  • “最好是可以在编译时完成的东西” - 所以你知道你将在你编译的计算机上运行吗?来自wikipedia“当前实现中使用了 48 位”/“架构定义允许在未来的实现中将此限制提高到完整的 64 位”,因此您使用的任何 hack 都可能在以后的硬件/操作系统上中断。您关心的只是new-ed 内存,还是必须支持指向局部和全局变量、共享内存、malloc-ed 内存等的指针?无论如何,您使用的 编译器 是必不可少的信息。
  • @Deduplicator 我需要超过 2GB(但目前小于 256TB)。时间查看有关 cpuid 指令的 intels 文档。

标签: c++ windows pointers 64-bit


【解决方案1】:

Windows has exactly one switch for 32bit and 64bit programs to determine the top of their virtual-address-space:

IMAGE_FILE_LARGE_ADDRESS_AWARE

对于这两种类型,省略它会将程序限制为较低的 2 GB 地址空间,从而严重减少应用程序可以映射的内存,从而降低地址空间布局随机化(ASLR,一种攻击缓解机制)的有效性)。

虽然它有一个好处,而且正是您想要的:只能设置指针的低 31 位,因此指针可以安全地通过int(32 位整数,符号-或零扩展名)。


在运行时情况稍微好一些:

只需使用 intel 的 cpuid-指令,函数 EAX=80000008H,并从位 8-15 读取虚拟地址的最大使用地址位数。

操作系统不能使用超过 CPU 支持的资源,请记住英特尔坚持使用规范地址(符号扩展)。

请参阅此处了解如何在 C++ 中使用 cpuidCPUID implementations in C++

【讨论】:

  • 第一个声明与 this post 相矛盾,this post 声称 64 位进程根据定义是大地址感知的。
  • @MSalters:这不是根据定义,而是默认情况下,根据 MS。添加了来源。
  • 谢谢,这确实是一个微妙但相关的区别。
猜你喜欢
  • 2010-10-23
  • 2010-11-27
  • 2010-12-23
  • 2011-04-04
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 2020-06-22
相关资源
最近更新 更多