以编程方式在运行时检测 CPU 体系结构



是否可以检查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 制造商。

最新更新