【问题标题】:C/C++ How to get Processor Serial Number on linuxC/C++ 如何在 linux 上获取处理器序列号
【发布时间】:2017-05-31 02:30:30
【问题描述】:

我想知道如何在 GNU Linux 上可靠地获取处理器序列号 (PSN)。

目前我正在使用这个

#include <stdio.h>
#include <cpuid.h>

unsigned int level = 1;
unsigned eax = 3 /* processor serial number */, ebx = 0, ecx = 0, edx = 0;
__get_cpuid(level, &eax, &ebx, &ecx, &edx);

// byte swap
int first = ((eax >> 24) & 0xff) | ((eax << 8) & 0xff0000) | ((eax >> 8) & 0xff00) | ((eax << 24) & 0xff000000);
int last = ((edx >> 24) & 0xff) | ((edx << 8) & 0xff0000) | ((edx >> 8) & 0xff00) | ((edx << 24) & 0xff000000);

printf("PSN: %08X%08X", first, last);

它给了我PSN: A7060200FFFBEBBF

匹配
sudo dmidecode | grep -P '^\s+ID: ([0-9A-F]{2} ){7}[0-9A-F]{2}$'

输出:ID: A7 06 02 00 FF FB EB BF

我只在 Intel Core i 处理器上进行了测试,所以也许它只适用于这种类型的 CPU。

我知道“序列号”在相同的 CPU 型号中是相同的,因此不是唯一的。

另外,我期待找到一种不依赖于执行 shell 命令和解析输出的方法。

【问题讨论】:

  • 希望this有所帮助。
  • 谢谢,我的代码 sn-p 已经从那个答案中得到启发,但不幸的是它适用于 Intel Pentum III。他还使用了仅适用于 x86 的 asm volatile 代码,我正在避免这种情况。他也没有使用相同的值,使用的级别为 0,这对我不起作用,并且他使用不同的寄存器,ecx edx,而 me eax edx。
  • 它适用于 AMD,但不适用于所有 ARM 处理器
  • 好的。但是为什么Intel Pentium III的例子使用不同的级别来获得PSN呢?
  • 你好@Bap,你有机会在其他 x86/64 处理器上测试你的代码吗? (也许至强?)。有用吗?

标签: c++ c linux processor cpuid


【解决方案1】:

你可以使用popen然后解析结果

unsigned char *pk = new unsigned char[100];
    FILE *source = popen("lscpu", "r");
    while (!feof(source)) {
        fread(pk, 100, 1, source);
        for(int i=0;i<100;++i)
        {
            printf("%c",pk[i]);
        }
        printf("\n");
    }
    pclose(source);

【讨论】:

  • 谢谢,但我正在寻找一种不依赖于执行 shell 命令和检索输出的解决方案。
猜你喜欢
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多