
Дизайн пользовательских интерфейсов «несколькими кликами мыши» вызывает немало споров в среде разработчиков и экспертов. Мнения разделяются от полного неприятия такого похода и рассмотрения его как метода трудоустройства неквалифицированной рабочей силы до возведения в ранг «технологии будущего». Здесь уместно вспомнить, что любое решение нельзя рассматривать в отрыве от поставленной задачи, поэтому технологии бывают не хорошие и плохие, а уместно и неуместно примененные.
Постановка задачи
В тестовой лаборатории «Компостера» нередко возникает необходимость оперативной разработки и макетирования специализированных информационно-диагностических утилит для детального исследования системных ресурсов и различного оборудования. Сегодня мы предлагаем вниманию читателя отчет о дизайне утилиты CPUID методами визуального программирования в картинках. Инструменты: Free Pascal и среда разработки Lazarus. Служебная подпрограмма получения информации CPUID написана в среде Flat Assembler и подключается как объектный файл формата ELF64 (Linux) или MS64 COFF (Windows).
Рис 1. Серверная плата Supermicro X11SSL-F с установленным процессором Intel Xeon CPU E3-1270 v5
В качестве тестовой платформы, для демонстрации возможностей утилиты CPUID, была выбрана серверная плата Supermicro X11SSL-F с установленным процессором Intel Xeon CPU E3-1270 v5.
Решение задачи
Утилита будет выводить экран дампа, визуализирующий результаты всех детектированных функций и подфункций CPUID в цифровом виде, а также экраны детальной информации, ассоциированные с конкретными функциями. Текущая версия утилиты поддерживает только процессоры Intel.
Рис 2. Процесс разработки и отладки приложения в среде Lazarus, ОС Linux
Изначально, приложение создано в среде Linux.
Рис 3. Тот же проект загружен в среде Lazarus, ОС Windows; хотя внешний вид
окон изменился в соответствии со стилем интерфейса ОС, функциональность
успешно портирована
Изменения, необходимые для адаптации под Windows, коснулись исключительно ассемблерного модуля libcpuid.obj, и оказались безболезненными для объектов пользовательского интерфейса.
Главное окно дампа. Результаты всех функций и подфункций CPUID. В инженерной версии 0.03 не поддерживается только Virtual CPUID.
Рис 5. Функция 0 инструкции CPUID
Стандартная функция 0 возвращает максимальный номер поддерживаемой стандартной функции и текстовую строку Vendor String.
Рис 6. Функция 1 инструкции CPUID
Стандартная функция 1 возвращает сигнатуру процессора: Type, Family, Model, Stepping, некоторые параметры мультипроцессорной топологии, базовый набор возможностей CPU Standard Features Bitmap.
Рис 7. Функция 2 инструкции CPUID
Стандартная функция 2 возвращает набор дескрипторов, большинство из которых характеризует подсистему TLB (Translation Lookaside Buffer), реализующую кэширование элементов таблиц страниц при трансляции виртуального адреса в физический.
Рис 8. Функция 3 инструкции CPUID
Стандартная функция 3 должна была бы вернуть серийный номер процессора Processor Serial Number (PSN). По ряду причин, компания Intel отказалась от поддержки данной функции, поэтому видим пустые поля.
Рис 9. Функция 4 инструкции CPUID
Стандартная функция 4 возвращает информацию Deterministic Cache Parameters: размер, ассоциативность, разделение на банки, метод инициализации для всех видов и уровней кэш-памяти.
Рис 10. Функция 5 инструкции CPUID
Стандартная функция 5 позволяет определить набор Power-Management состояний, реализуемый в рамках инструкций MONITOR, MWAIT. Замена традиционного состояния останова процессора, набором состояний, дифференцированных по потребляемой мощности и латентности возврата в рабочий режим, позволяет оптимизировать энергопотребление платформ.
Рис 11. Функция 6 инструкции CPUID
Стандартная функция 6 определяет параметры термоконтроля и тактирования процессора. Здесь же индикатор поддержки технологии Intel Turbo Boost.
Рис 12. Функция 7 инструкции CPUID
Стандартная функция 7 возвращает информацию Additional Features Bitmap. Сюда входят технологии обеспечения безопасности, механизмы транзакционной памяти, инструкции манипуляции с битами, векторные расширения AVX2 и AVX512 и ряд дополнительных возможностей. Как видим, компания Intel собрала достаточно разные технологии в едином списке, действуя по признаку даты появления данных технологий и несколько пожертвовав систематизацией.
Рис 13. Функция 9 инструкции CPUID
Стандартная функция 9 позволяет прочитать копию состояния одного из системных регистров, управляющих технологией DCA (Direct Cache Access). Напомним, эта технология обеспечивает доступ bus-master устройств к кэш-памяти процессора. А альтернативный механизм чтения с помощью CPUID и копия этого системного регистра потребовались потому, что основной механизм (инструкция RDMSR) доступен только на уровне привилегий Ring0.
Рис 14. Функция 0Ah инструкции CPUID
Стандартная функция 0Ah декларирует возможности, связанные с мониторингом различных событий, влияющих на производительность, например, обращения к кэш-памяти, кэш-промахи, ошибки предсказания условных переходов и т.п. Отметим, что в отличие от большинства функций, биты списка обрабатываемых событий инверсные: 0 означает наличие поддержки, 1 – отсутствие.
Рис 15. Функция 0Bh инструкции CPUID
Стандартная функция 0Bh декларирует мультипроцессорную топологию (для ядер и потоков одного процессора). Отметим, что параметр Current x2APIC ID может различаться от запуска к запуску, так как прочитанный идентификатор зависит от того, на каком процессоре, ядре и потоке ОС запустит наше приложение.
Рис 16. Функция 0Dh инструкции CPUID
Стандартная функция 0Dh декларирует поля процессорного контекста, подлежащие сохранению и восстановлению при переключении задач. Напомним, аппаратная поддержка переключения контекста реализована в современных процессорах инструкциями XSAVE и XRSTOR.
Рис 17. Функция 80000000h инструкции CPUID
Расширенная функция 80000000h возвращает максимальный номер поддерживаемой расширенной функции.
Рис 18. Функция 80000001h инструкции CPUID
Расширенная функция 80000001h возвращает битовую карту CPU Extended Features Bitmap. Большинство битов зарезервировано, поскольку данная функция изначально разрабатывалась для процессоров AMD. Также заметим, что для некоторых процессоров, информация CPUID, возвращаемая в 64-битном режиме и 32-битном режиме совместимости, различается. Это относится, например к поддержке инструкции системного вызова SYSCALL.
Рис 19. Функция 80000002h инструкции CPUID
Расширенные функции 80000002h, 80000003h, 80000004h возвращают имя процессора в виде текстовой строки, что дает возможность приложению, «не узнавшему» конкретный процессор, тем не менее корректно визуализировать его модель.
Рис 20. Функция 80000008h инструкции CPUID
Расширенная функция 80000008h позволяет определить разрядность физического и виртуального адреса. В данном примере, 39 и 48 бит обеспечивают размеры адресных пространств, 512 гигабайт и 256 терабайт соответственно.
Резюме
Итак, в течение примерно одного рабочего дня, удалось создать пользовательский интерфейс приложения и небольшой ассемблерный модуль, предназначенный для чтения информации из процессора.
Интерфейс построен в виде системы таблиц-вкладок, содержащих детальную информацию, систематизированную по функциям CPUID. Приложение, изначально написанное в среде Linux x64, за считанные минуты портируется под Windows x64, требуется небольшая корректировка ассемблерного модуля. Возможности среды разработки Lazarus позволяют запланировать создание Android-версии для x86. Адаптация для ARM-архитектуры, будет означать редизайн утилиты, таков наш частный случай, когда в центре исследования — системные объекты Intel x86.
И наконец, ложка дегтя. Размер EXE-модуля около 3 мегабайт. Для сравнения, ассемблерная реализация аналогичной функциональности займет менее 10 килобайт. Код Java-класса также весьма компактен, хотя не самодостаточен и потребует загрузки в память виртуальной машины Java.