Плюсы и минусы визуального программирования

15 Фев 2016

CPUID возвращает сигнатуру процессора: Type, Family, Model, Stepping

Дизайн пользовательских интерфейсов «несколькими кликами мыши» вызывает немало споров в среде разработчиков и экспертов. Мнения разделяются от полного неприятия такого похода и рассмотрения его как метода трудоустройства неквалифицированной рабочей силы до возведения в ранг «технологии будущего». Здесь уместно вспомнить, что любое решение нельзя рассматривать в отрыве от поставленной задачи, поэтому технологии бывают не хорошие и плохие, а уместно и неуместно примененные.

Постановка задачи

В тестовой лаборатории «Компостера» нередко возникает необходимость оперативной разработки и макетирования специализированных информационно-диагностических утилит для детального исследования системных ресурсов и различного оборудования. Сегодня мы предлагаем вниманию читателя отчет о дизайне утилиты CPUID методами визуального программирования в картинках. Инструменты: Free Pascal и среда разработки Lazarus. Служебная подпрограмма получения информации CPUID написана в среде Flat Assembler и подключается как объектный файл формата ELF64 (Linux) или MS64 COFF (Windows).

Серверная плата Supermicro X11SSL-F с установленным процессором Intel Xeon CPU E3-1270 v5
Рис 1Серверная плата Supermicro X11SSL-F с установленным процессором Intel Xeon CPU E3-1270 v5

В качестве тестовой платформы, для демонстрации возможностей утилиты CPUID, была выбрана серверная плата Supermicro X11SSL-F с установленным процессором Intel Xeon CPU E3-1270 v5.

Решение задачи

Утилита будет выводить экран дампа, визуализирующий результаты всех детектированных функций и подфункций CPUID в цифровом виде, а также экраны детальной информации, ассоциированные с конкретными функциями. Текущая версия утилиты поддерживает только процессоры Intel.

Процесс разработки и отладки приложения в среде Lazarus, ОС Linux
Рис 2Процесс разработки и отладки приложения в среде Lazarus, ОС Linux

Изначально, приложение создано в среде Linux.

Тот же проект загружен в среде Lazarus, ОС Windows; хотя внешний вид окон изменился в соответствии со стилем интерфейса ОС, функциональность успешно портирована
Рис 3Тот же проект загружен в среде Lazarus, ОС Windows; хотя внешний вид
окон изменился в соответствии со стилем интерфейса ОС, функциональность
успешно портирована

Изменения, необходимые для адаптации под Windows, коснулись исключительно ассемблерного модуля libcpuid.obj, и оказались безболезненными для объектов пользовательского интерфейса.

Закладка CPUID dump
Рис 4. Закладка CPUID dump

Главное окно дампа. Результаты всех функций и подфункций CPUID. В инженерной версии 0.03 не поддерживается только Virtual CPUID.

Функция 0 инструкции CPUID
Рис 5. Функция 0 инструкции CPUID

Стандартная функция 0 возвращает максимальный номер поддерживаемой стандартной функции и текстовую строку Vendor String.

Функция 1 инструкции CPUID
Рис 6. Функция 1 инструкции CPUID

Стандартная функция 1 возвращает сигнатуру процессора: Type, Family, Model, Stepping, некоторые параметры мультипроцессорной топологии, базовый набор возможностей CPU Standard Features Bitmap.

Функция 2 инструкции CPUID
Рис 7. Функция 2 инструкции CPUID

Стандартная функция 2 возвращает набор дескрипторов, большинство из которых характеризует подсистему TLB (Translation Lookaside Buffer), реализующую кэширование элементов таблиц страниц при трансляции виртуального адреса в физический.

Функция 3 инструкции CPUID
Рис 8. Функция 3 инструкции CPUID

Стандартная функция 3 должна была бы вернуть серийный номер процессора Processor Serial Number (PSN). По ряду причин, компания Intel отказалась от поддержки данной функции, поэтому видим пустые поля.

Функция 4 инструкции CPUID
Рис 9. Функция 4 инструкции CPUID

Стандартная функция 4 возвращает информацию Deterministic Cache Parameters: размер, ассоциативность, разделение на банки, метод инициализации для всех видов и уровней кэш-памяти.

Функция 5 инструкции CPUID
Рис 10. Функция 5 инструкции CPUID

Стандартная функция 5 позволяет определить набор Power-Management состояний, реализуемый в рамках инструкций MONITOR, MWAIT. Замена традиционного состояния останова процессора, набором состояний, дифференцированных по потребляемой мощности и латентности возврата в рабочий режим, позволяет оптимизировать энергопотребление платформ.

Функция 6 инструкции CPUID
Рис 11. Функция 6 инструкции CPUID

Стандартная функция 6 определяет параметры термоконтроля и тактирования процессора. Здесь же индикатор поддержки технологии Intel Turbo Boost.

Функция 7 инструкции CPUID
Рис 12. Функция 7 инструкции CPUID

Стандартная функция 7 возвращает информацию Additional Features Bitmap. Сюда входят технологии обеспечения безопасности, механизмы транзакционной памяти, инструкции манипуляции с битами, векторные расширения AVX2 и AVX512 и ряд дополнительных возможностей. Как видим, компания Intel собрала достаточно разные технологии в едином списке, действуя по признаку даты появления данных технологий и несколько пожертвовав систематизацией.

Функция 9 инструкции CPUID
Рис 13. Функция 9 инструкции CPUID

Стандартная функция 9 позволяет прочитать копию состояния одного из системных регистров, управляющих технологией DCA (Direct Cache Access). Напомним, эта технология обеспечивает доступ bus-master устройств к кэш-памяти процессора. А альтернативный механизм чтения с помощью CPUID и копия этого системного регистра потребовались потому, что основной механизм (инструкция RDMSR) доступен только на уровне привилегий Ring0.

Функция 0Ah инструкции CPUID
Рис 14. Функция 0Ah инструкции CPUID

Стандартная функция 0Ah декларирует возможности, связанные с мониторингом различных событий, влияющих на производительность, например, обращения к кэш-памяти, кэш-промахи, ошибки предсказания условных переходов и т.п. Отметим, что в отличие от большинства функций, биты списка обрабатываемых событий инверсные: 0 означает наличие поддержки, 1 – отсутствие.

Функция 0Bh инструкции CPUID

Рис 15. Функция 0Bh инструкции CPUID

Стандартная функция 0Bh декларирует мультипроцессорную топологию (для ядер и потоков одного процессора). Отметим, что параметр Current x2APIC ID может различаться от запуска к запуску, так как прочитанный идентификатор зависит от того, на каком процессоре, ядре и потоке ОС запустит наше приложение.

Функция 0Dh инструкции CPUID
Рис 16. Функция 0Dh инструкции CPUID

Стандартная функция 0Dh декларирует поля процессорного контекста, подлежащие сохранению и восстановлению при переключении задач. Напомним, аппаратная поддержка переключения контекста реализована в современных процессорах инструкциями XSAVE и XRSTOR.

Функция 80000000h инструкции CPUID
Рис 17. Функция 80000000h инструкции CPUID

Расширенная функция 80000000h возвращает максимальный номер поддерживаемой расширенной функции.

Функция 80000001h инструкции CPUID
Рис 18. Функция 80000001h инструкции CPUID

Расширенная функция 80000001h возвращает битовую карту CPU Extended Features Bitmap. Большинство битов зарезервировано, поскольку данная функция изначально разрабатывалась для процессоров AMD. Также заметим, что для некоторых процессоров, информация CPUID, возвращаемая в 64-битном режиме и 32-битном режиме совместимости, различается. Это относится, например к поддержке инструкции системного вызова SYSCALL.

Функция 80000002h инструкции CPUID
Рис 19. Функция 80000002h инструкции CPUID

Расширенные функции 80000002h, 80000003h, 80000004h возвращают имя процессора в виде текстовой строки, что дает возможность приложению, «не узнавшему» конкретный процессор, тем не менее корректно визуализировать его модель.

Функция 80000008h инструкции CPUID
Рис 20. Функция 80000008h инструкции CPUID

Расширенная функция 80000008h позволяет определить разрядность физического и виртуального адреса. В данном примере, 39 и 48 бит обеспечивают размеры адресных пространств, 512 гигабайт и 256 терабайт соответственно.

Резюме

Итак, в течение примерно одного рабочего дня, удалось создать пользовательский интерфейс приложения и небольшой ассемблерный модуль, предназначенный для чтения информации из процессора.

Интерфейс построен в виде системы таблиц-вкладок, содержащих детальную информацию, систематизированную по функциям CPUID. Приложение, изначально написанное в среде Linux x64, за считанные минуты портируется под Windows x64, требуется небольшая корректировка ассемблерного модуля. Возможности среды разработки Lazarus позволяют запланировать создание Android-версии для x86. Адаптация для ARM-архитектуры, будет означать редизайн утилиты, таков наш частный случай, когда в центре исследования — системные объекты Intel x86.

И наконец, ложка дегтя. Размер EXE-модуля около 3 мегабайт. Для сравнения, ассемблерная реализация аналогичной функциональности займет менее 10 килобайт. Код Java-класса также весьма компактен, хотя не самодостаточен и потребует загрузки в память виртуальной машины Java.

Теги: