如何在Windows / Linux C上检查CPU名称,型号,速度?

我想获得一些关于硬件的C信息:

  1. 我有多少CPU
  2. 每个核心有多少个核心
  3. 每个CPU中每个核心有多少个逻辑核心
  4. CPU名称+型号
  5. CPU速度+频率
  6. CPU架构(x86,x64)

我知道在类似Linux的操作系统上我可以解析/proc/cpuinfo但由于它不是普通文件,我认为它不安全。 在SO上看到这个答案,但它并没有给我我需要的每一个信息。 我应该调用cat /proc/cpuinfo > file.txt然后解析file.txt吗? 我知道cpuid.h (我正在使用GCC)但是找不到关于这个标题的任何文档(无论如何 – 使用它是个好主意吗?)

Linux procfs的假文件可能会出现问题。 内核错误地将它们报告为常规文件,但它们不像在符合要求的POSIX系统上那样需要常规文件。 有关示例,请访问http://www.openwall.com/lists/musl/2013/05/05/9 。 我怀疑你听过类似的报道,而这正是你关注的问题所在。

据说,据我所知, /proc假冒“常规文件”的所有不良行为仅与写作有关。 对于阅读,它们的行为应该与实际常规文件足够相似,您可以随意阅读它们而不用担心它。

对于Windows,您需要GetSystemInfo函数; 微软有一个例子 。 在Linux上, /proc/cpuinfo完全“安全”,无论这意味着什么,但已经有了这个问题的答案 。

如果您只关心与intel兼容的CPU,则可以使用汇编程序指令

 cpuid 

作为内联asm或作为单独的asm目标文件。

例如,要检查供应商,您将使用函数0:

 xor eax, eax ; load eax with function 0 cpuid ; call cpuid 

现在供应商ID位于寄存器ebx, ecx, edx 。 存在类似的function来读取所有其他信息。

有关更多信息,请阅读本文