В Microsoft Windows можете да получите ID на процесора (не ID на процеса) чрез WMI, който в този случай (само при придобиване на ID на процесор) се основава на инструкция за CPUID
Има ли подобен метод за получаване на този ID на Linux?
Получаване на ID на процесора в Linux
Отговори (2)
Не знам какво е WMI
и MS-Windows "CPUID
инструкция", тъй като не знам или използвам MS-Windows (малко потребители тук го знаят). Така че не мога да кажа със сигурност дали това предлага същата информация, но опитайте с cat /proc/cpuinfo
. Ако имате нужда от конкретна стойност, можете да grep
я изведете лесно.
Ако трябва да направите това от програма, тогава можете да използвате файловите помощни средства, за да прочетете такава информация. Винаги имайте предвид един от най-основните принципи на операционните системи в стил 'unix': всичко е файл.
За контекста на въпроса на OP, ProcessorID
стойността, върната от WMI, е документирано по следния начин:
Информация за процесора, която описва характеристиките на процесора. За CPU от клас x86 форматът на полето зависи от поддръжката на процесора на инструкцията CPUID. Ако инструкцията се поддържа, свойството съдържа 2 (две) DWORD форматирани стойности. Първото е отместване от 08h-0Bh, което е EAX стойността, която CPUID инструкцията връща с входен EAX, зададен на 1. Второто е отместване от 0Ch-0Fh, което е EDX стойността, която инструкцията връща. Само първите два байта от свойството са значими и съдържат съдържанието на DX регистъра при нулиране на процесора - всички останали са зададени на 0 (нула), а съдържанието е във формат DWORD.
Като пример, в моята система:
C:\>wmic path Win32_Processor get ProcessorId
ProcessorId
BFEBFBFF000206A7
Обърнете внимание, че ProcessorID е просто двоично кодиран формат на информация, обикновено наличен в други формати, по-специално подпис (Family/Model/Stepping/Processor type) и флагове на функции. Ако имате нужда само от информацията, може всъщност да не се нуждаете от този идентификатор -- просто вземете вече декодираната информация от /proc/cpuinfo
.
Ако наистина искате тези 8 байта, има няколко начина да получите ProcessorID в Linux.
С root/sudo идентификаторът се съдържа в изхода на dmidecode
:
<snip>
Handle 0x0004, DMI type 4, 35 bytes
Processor Information
Socket Designation: CPU Socket #0
Type: Central Processor
Family: Other
Manufacturer: GenuineIntel
ID: A7 06 02 00 FF FB EB BF
<snip>
Обърнете внимание, че редът на байтовете е обърнат: Windows връща резултатите в ред на Big-Endian, докато Linux ги връща в ред на Little-Endian.
Ако нямате root разрешения, е почти възможно да възстановите ProcessorID от /proc/cpuinfo
чрез двоично кодиране на стойностите, които връща. За „подписа“ (първите четири байта в Windows/последните четири байта в Linux) можете да кодирате двоично идентификацията, извлечена от /proc/cpuinfo
, за да съответства на Документация на Intel Фигура 5-2 (други производители я използват за съвместимост).
- Стъпването е в битове 3-0
- Моделът е в битове 19-16 и 7-4
- Семейството е в битове 27-20 и 11-8
- Типът процесор е в битове 13-12 (
/proc/cpuinfo
не ви казва това, приемете 0)
По подобен начин можете да попълните останалите четири байта, като итерирате флаговете на функциите (flags
ключ в /proc/cpuinfo
) и зададете битове, както е подходящо съгласно Таблица 5-5 от документа на Intel, свързан по-горе.
И накрая, можете да инсталирате пакета cpuid
(напр. в Ubuntu, sudo apt-get install cpuid
). След това, като изпълните командата cpuid -r
(сурова), можете да анализирате нейния изход. Бихте комбинирали стойностите от EAX и EDX регистрите за първоначална EAX стойност от 1:
$ cpuid -r
CPU 0:
0x00000000 0x00: eax=0x0000000d ebx=0x756e6547 ecx=0x6c65746e edx=0x49656e69
0x00000001 0x00: eax=0x000206a7 ebx=0x00020800 ecx=0x9fba2203 edx=0x1f8bfbff
<snip>