Получение идентификатора процессора в Linux

В Microsoft Windows вы можете получить идентификатор процессора (не идентификатор процесса) через WMI, который в этом случае основан (только при получении идентификатора процессора) на инструкции CPUID
Существует ли аналогичный метод получения этого идентификатора в Linux?


person Community    schedule 01.12.2013    source источник
comment
взгляните сюда: [get-CPUID-program][1] Небольшая c-программа показывает, как это происходит. [1]: stackoverflow.com/questions/15368394/   -  person user3054986    schedule 01.12.2013


Ответы (2)


Я не знаю, что такое WMI и "CPUID инструкция" для MS-Windows, так как не знаю и не использую MS-Windows (немногие пользователи здесь). Поэтому я не могу точно сказать, предлагает ли это ту же информацию, но попробуйте с cat /proc/cpuinfo. Если вам требуется конкретное значение, вы можете легко его grep указать.

Если вам нужно сделать это из программы, вы можете использовать файловые утилиты для чтения такой информации. Всегда помните об одном из основных принципов операционных систем в стиле Unix: все является файлом.

person arkascha    schedule 01.12.2013
comment
это набор информации о wmi WMI И инструкция CPUID не ограничивается Microsoft Windows, на самом деле это инструкция по сборке, см. CPUID - person ; 01.12.2013
comment
Вы думаете, я не пытался увидеть файл cpuinfo? Поскольку я не получил ожидаемого результата, я разместил этот вопрос - person ; 01.12.2013
comment
Извините, я не могу догадаться, пытались ли вы прочитать псевдофайловую систему proc. Вы ничего не писали об этом, поэтому я и предположил, что вы этого не сделали. Судя по тому, как вы спросили, я предположил, что вы новичок в Linux, поэтому я подумал, что подсказка в этом направлении может помочь. Это может быть неправильным выводом с моей стороны, не поймите неправильно. Но если вы не напишете, что уже пробовали, то не можете ожидать, что мы об этом узнаем! А так как вы даже сейчас не написали, чего вам еще не хватает в этой информации, то я не могу с этим помочь. Извиняюсь. - person arkascha; 01.12.2013
comment
Я тот, кто должен сожалеть, что не написал это :) - person ; 01.12.2013

В контексте вопроса 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>
person Daniel Widdis    schedule 04.02.2017