操作系统或程序如何检测 CPU 型号名称?

电器工程 中央处理器 计算机架构 集会 指令系统
2022-01-23 15:45:09

共享指令集的 2 个处理器存在什么样的二进制兼容性?. 我曾在 Computer Science Stack Exchange 上问过一个问题,得到的答案是:

作为一个小问题,您可以编写一个程序,尝试打印它在哪个处理器上运行、多少个内核、多少内存等等。这样的程序显然应该在 x86 和 AMD CPU 上产生不同的结果。

我不知道如何用任何编程语言或汇编代码编写一个正确打印处理器名称的程序。这样的程序将在 Intel i3-3220 机器上打印“Intel i3-3220”,在 AMD Ryzen 5000 机器上打印“AMD Ryzen 5000 ...”(不知道确切的型号名称)。由于两个处理器都是二进制兼容的,我应该能够编写一个在它们上运行的程序而无需重新编译。如果存在打印处理器名称的程序,则必须首先检测处理器。当然,它可以向操作系统询问处理器名称,但这与编写程序检测 CPU 型号不同。我不认为这样的程序存在。但操作系统正确检测到 CPU 型号。

Ubuntu 对 AMD 和 Intel x86-64 处理器使用相同的操作系统。只有一个 x86-64 位版本可用,称为 AMD64,可在 AMD 和 Intel x86-64 机器上运行。操作系统如何使用相同的二进制兼容程序检测 CPU 型号?

3个回答

对于 x86,您可以使用CPUID指令。它允许您查询有关 CPU 的各种信息。它直接内置在 CPU 中(不是操作系统服务)。

架构定义了软件在符合架构的实现上运行时可以预期的结果。它本质上是一个确保不同实现和微架构之间二进制兼容性的合约。

通常,ISA 仅构成架构的(小)部分(x86、AMD64、ARM、RV 等)。该架构还定义了寄存器、调试、异常处理、[..]。任何实现给定架构的设计还必须包括这些不同的项目以符合该架构。

在您关于 CPU 识别的特定问题中,架构将定义确定实现 ID、可选架构特性等的方法。乔纳森的回答涵盖了CPUIDx86(_64) 中的指令,并显示了在架构的不同实现上运行时的二进制兼容性。这是关于 SO 的答案,它描述了使用寄存器访问在 ARM64 (AArch64) 实现中查找类似信息。(顺便说一下,在这两个示例(x86、ARM)中访问此信息的不同方式是 CISC 和 RISC 架构之间概念差异的一个很好的示例。)

在 RISC-V 中,有一个机器实现 ID 寄存器 (mimpid),它提供了处理器实现的源代码和版本的唯一编码。

资料来源: RISC-V 指令集手册第二卷:特权架构版本 1.7