Простой пример визуализации результатов работы инструкции CPUID

Было время, когда много полезной информации о новых процессорах можно было выудить из документа «Intel Processor Identification and the CPUID Instruction». Сей мануал регулярно обновлялся и был полон описаниями инноваций, буквально переполнявших компанию Intel. К сожалению, с мая 2012 года описание инструкции CPUID перекочевало в многотомник «Intel 64 and IA-32 Architectures Software Developer«s Manual», а ссылка на указанный документ форвардится на один из томов ярбуха (конкретно — Vol. 2A).

С этого момента уследить за новшествами стало сложнее. Возникла мысль с помощью несложной утилиты визуализировать результаты работы CPUID с тем, с тем чтобы мониторить внедрение новинок и быть в курсе. (Процесс разработки софта изложен здесь, последняя его версия доступна здесь).

Сервер-кубик на базе платы Supermicro X11SSL-F производства компании Entry

Собственно, революционной новизны в таких разработках быть не может по определению, а вот удобство, с которым мы наблюдаем развитие процессорного парка, — неоспоримо. Проверим это допущение, исследовав функциональность процессора из недавно появившегося семейства SkyLake. В качестве тестовой платформы использовался сервер-кубик на базе платы Supermicro X11SSL-F (спасибо компании Entry). О процессоре помолчим: пусть расскажет всё сам…

CPUID=80000002h

С помощью утилиты мы сразу открываем для себя ряд функций, которыми снабжены процессоры SkyLake. Попробуем прокомментировать свои находки — дополнения в архитектуре инструкции CPUID, связанные с появлением нового семейства.

CPUID=0000000Eh


Функция 0000000Eh зарезервирована, результаты в регистрах нулевые.

CPUID=0000000Fh


CPUID=0000000Fh

Функция 0000000Fh Platform Quality of Service Monitoring Enumeration, декларирует функциональность, позволяющую выполнить мониторинг использования процессорных ресурсов приложением. Согласно документации, на сегодня такой мониторинг реализован только для L3 Cache, хотя предусматривается возможность добавления других ресурсов в список анализируемых. Несмотря на то, что эта функция входит в диапазон поддерживаемых процессором функций, результаты в регистрах нулевые. Это означает, что данный процессор не поддерживает эту возможность. А диапазон увеличили для добавления новых функций с большими номерами.

CPUID=00000010h


CPUID=00000010h

Функция 00000010h Platform Quality of Service Enforcement Enumeration, декларирует функциональность, позволяющую операционной системе устанавливать приоритеты приложений (потоков) при использовании общих ресурсов. Как и для выше описанной функции, пока речь только об L3 cache. Несмотря на то, что эта функция входит в диапазон поддерживаемых процессором функций, результаты в регистрах нулевые. Это означает, что данный процессор не поддерживает эту возможность.

CPUID=00000011h


Функция 00000011h зарезервирована, результаты в регистрах нулевые.

CPUID=00000012h


CPUID=00000012h

Функция 00000012h Intel SGX Resource Enumeration декларирует возможности технологии Software Guard Extension, это технология обеспечения безопасности, позволяющая создавать в составе приложений области, закрытые для доступа (enclaves). Теоретически, такая защита достаточно эффективна, в том числе в ситуациях, когда атакующий вредоносный код имеет привилегии супервизора Ring0 (privileged attack), а также при аппаратном перехвате трафика памяти (snooping attack).

Наборы инструкций SGX1, SGX2 отмечены как не поддерживаемые, максимальные значения размера защищенной области (enclave size = 1 byte) не валидны. С другой стороны, согласно результатам функции CPUID #7, флаг поддержки SGX=1. Согласно документации, процессор поддерживает SGX. Возможные причины такого противоречия: Firmware не инициализировало ресурсы SGX, например, если эта технология не включена в CMOS Setup, либо не поддерживается из-за старой версии Firmware. Роль инициализационных процедур UEFI в формировании значений указанных полей станет темой отдельного материала.

CPUID=00000013h


Функция 00000013h зарезервирована, результаты в регистрах нулевые.

CPUID=00000014h


CPUID=00000014h

Функция 00000014h Intel Processor Trace Enumeration декларирует функциональность, обеспечивающую трассировку выполнения программы с протоколированием информации о происходящих событиях, например, условных и безусловных переходах, вызовах подпрограмм. Протокол ведется с привязкой к реальному времени. Технология трассировки RTIT (Real Time Instruction Trace) с использованием таймера MTC (Mini Time Counter) поддерживается данным процессором. Аббревиатура COFI означает Change of Flow Instruction, и определяет множество событий, связанных с условной и безусловной передачей управления, мониторингом которых можно управлять. Детальное описание этой функциональности станет темой отдельного материала.

CPUID=00000015h


CPUID=00000015h

Функция 00000015h Time Stamp Counter/Core Crystal Clock Information Enumeration декларирует соотношение между TSC и некоторым внутренним источником опорной частоты, названным «Core Crystal Clock».

  • EAX = denominator = знаменатель = 2
  • EBX = numerator = числитель = 12Ch = 300
  • Соотношение = 300/2


Частота указанного источника опорной частоты в 150 раз меньше частоты TSC. Согласно документации Intel, одним из таких источников может быть таймер, реализованный в процессоре в составе контроллера прерываний Local APIC. Данная функция декларируется битом Always Running APIC Timer, что подчеркивает функциональность такого таймера в различных Power-Management состояниях процессора.

CPUID=00000016h


CPUID=00000016h

Функция 00000016h Processor Frequency Information позволяет прочитать значения основных тактовых частот процессора. Возвращаемые константы соответствуют модели процессора, не следует использовать эту функцию как альтернативу измерению частоты, иначе возможны некорректные показания в случае «разгона».

  • EAX = Processor Base Frequency (MHz) = 0E10h = 3600 MHz
  • EBX = Maximum Frequency (MHz) = 0FA0h = 4000 MHz (Turbo Boost)
  • ECX = Bus Frequency (MHz) = 064h = 100 MHz (Bus Clock)
  • EDX = Reserved = 0



Резюме


Как видим, ряд изменений в архитектуре CPUID лишь резервируют возможности, использовать которые процессорный гигант, видимо, намерен несколько позднее. С другой стороны, еще не реализованные, но заблаговременно описанные инструкции, в Одессе считаются внедренными.

© Habrahabr.ru