以编程方式在运行时检测 CPU 体系结构
Programmatically detect CPU architecture at runtime
是否可以检查x86/x86-64 CPU中的CPU架构(是64位或32位(,而无需通过低级代码(C/C++或汇编(从操作系统或某些API收集信息?
可以检查指针的大小,就像这里讨论的那样,但是,据我所知,这种方式可以让您知道操作系统架构是针对其编译的,因为运行 32 位操作系统的 64 位 CPU 会报告错误的结果。
也许一些cpuid
说明或类似的东西可以解决问题,但我找不到任何完全满足这些要求的东西。如果您认为这是不可能的,我将不胜感激一个很好的理由来证明这一点(这可能是一个不太客观的答案(。如果您想知道,这是针对CPU检测软件的。
编辑: 在确定汇编中的 32/64 位架构中,OP 没有得到一些解释如何做到这一点的具体答案,只是你应该使用 cpuid,以及链接到如何在运行时使用 GCC 和内联 asm 检测 CPU 架构类型?,这对我来说是一个很好的答案,但它并不像我标记为接受的答案那么完整, 因为 Remy Lebeau 给出了详细的解释并告诉必须查询哪个特定的 cpuid 位,而不仅仅是编写一些代码,我发现它更适合我的问题,因为它是在更高级别的范围内解释的(我从来没有提到过 gcc,第二篇文章确实如此(
可以为在32 位或 64 位模式下运行的 x86 编写代码。如果您正在运行此类代码,则可以使用以下方法检查您处于哪种模式:
get_mode:
mov eax, 1
dec eax
test eax, eax
ret
在 64 位模式下,dec eax
成为 REX。测试指令的 W 前缀。因此,此代码在 32 位模式下运行时返回 0,在 64 位模式下运行时返回 1。它还相应地设置 Z,因此可以从另一个汇编语言函数使用它,如下所示:
call get_mode
jnz mode64
如果编译 64 位可执行文件,则 CPU 必须仅为 64 位。
如果编译 32 位可执行文件,则 CPU可能是32 位或 64 位(如果 64 位 CPU 能够运行 32 位代码(,因此您必须查询 CPU 以区分。 最好尽可能从操作系统获取这些信息,但 CPU可能对该信息有自己的查询。
例如,在 x86 或 x86-64 CPU 上,有一个可用的CPUID
指令:
-
在英特尔 CPU 上,
CPUID
的"处理器信息和功能位"查询包括一个ia64
功能标志(IA64 处理器模拟 x86(。 -
在 AMD CPU 上,
CPUID
的"扩展处理器信息和功能位"查询包括一个long mode
功能标志。
CPUID
有一个"获取供应商 ID"查询来确定 CPU 制造商。
- 使用CMake检测支持的C++标准
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 当套接字连接断开时检测C/C++Unix
- C/C++预处理器是否可以检测一些编译器选项
- WMI检测进程创建事件-c++
- 基于树莓pi的tensorflow lite量化ssd目标检测
- 下面是我为检测链接列表中的循环而制作的代码
- 落砂模拟碰撞检测C++和SFML
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 为什么C++编译器没有检测到正确声明的类?
- 检测win32服务创建和删除的最佳方法
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 正在LLVM中检测整数比较条件
- 如何在鼠标挂钩过程中检测拖动
- 位移操作和位掩码未检测到重复字符
- 检测 COFF 对象文件中C++内联符号
- 以编程方式在运行时检测 CPU 体系结构
- 正在检测来自我的英特尔系统的 CPU 和内核信息
- 如何检测 CPU 是否支持英特尔防盗技术
- 与CPU版本相比,OpenCV GPU对象检测速度慢,检测次数少