В Microsoft Windows вы можете получить идентификатор процессора (не идентификатор процесса) через WMI, который в этом случае основан (только при получении идентификатора процессора) на инструкции CPUID
Существует ли аналогичный метод получения этого идентификатора в Linux?
Получение идентификатора процессора в Linux
Ответы (2)
Я не знаю, что такое WMI
и "CPUID
инструкция" для MS-Windows, так как не знаю и не использую MS-Windows (немногие пользователи здесь). Поэтому я не могу точно сказать, предлагает ли это ту же информацию, но попробуйте с cat /proc/cpuinfo
. Если вам требуется конкретное значение, вы можете легко его grep
указать.
Если вам нужно сделать это из программы, вы можете использовать файловые утилиты для чтения такой информации. Всегда помните об одном из основных принципов операционных систем в стиле Unix: все является файлом.
В контексте вопроса OP значение ProcessorID
, возвращаемое WMI, равно задокументировано таким образом:
Информация о процессоре, описывающая функции процессора. Для ЦП класса 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 — это просто двоично-кодированный формат информации, обычно доступный в других форматах, в частности, сигнатура (Семейство/Модель/Степпинг/Тип процессора) и флаги функций. Если вам нужна только информация, вам может не понадобиться этот идентификатор — просто получите уже расшифрованную информацию от /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.
Если у вас нет прав суперпользователя, почти можно восстановить идентификатор процессора из /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
(raw), вы можете проанализировать ее вывод. Вы должны объединить значения из регистров 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>