Мне было интересно, как надежно получить серийный номер процессора (PSN) на GNU Linux.C/C++ Как получить серийный номер процессора на linux
Сейчас я использую этот
#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 я процессоров , поэтому, возможно, он работает только для этого типа процессора.
Я знаю, что «серийный номер» идентичен по одинаковой модели процессора и, следовательно, не уникален.
Кроме того, я с нетерпением жду способа достижения этого, который не зависит от выполнения команды оболочки и анализа вывода.
Hope [это] (http://stackoverflow.com/questions/6491566/getting-the-machine-serial-number-and-cpu- id-using-cc-in-linux). – GAVD
Спасибо, мой фрагмент кода уже вдохновлен этим ответом, но, к сожалению, это для Intel Pentum III. Он также использует asm volatile код, который предназначен только для x86, чего я избегаю. Он также не использовал ту же ценность, уровень был 0, который не работал для меня, и он использовал разные регистры, ecx edx, тогда как me eax edx. – Annihil
Он будет работать для AMD, но не для всех процессоров ARM –