Для получения информации о мультипроцессорной топологии платформы, а также запуска заданных процедур с целью их выполнения на процессорах AP (Application Processors) в составе низкоуровневого программного обеспечения UEFI опционально поддерживается набор функций EFI_MP_SERVICES_PROTOCOL. Утилита SmpDetect.efi детектирует наличие данного протокола и обеспечивает получение информации о количестве логических процессоров вычислительной платформы. Утилита предназначена для выполнения в среде x64 UEFI.

Контекст UEFI firmware ориентирован на однопотоковое выполнение программного кода, функции UEFI API не являются реентерабельными и не поддерживают многозадачность. Вместе с тем, параллельное выполнение процедур, не использующих UEFI API, допускается. В отличие от Legacy BIOS, UEFI firmware предоставляет ряд сервисных функций, обеспечивающих инициализацию мультипроцессорной платформы и избавляющих системного программиста от необходимости непосредственного взаимодействия с регистрами контроллеров прерываний Local APIC, а также переключения процессоров AP в режим Protected Mode. Заметим, что после инициализации, процессоры AP функционируют в 16-битном режиме Real Mode и обеспечение их взаимодействия с процессором BSP, работающим в Protected Mode 64, является нетривиальной задачей.

Структура интерфейсного блока EFI_MP_SERVICES_PROTOCOL

Рис 1. Структура интерфейсного блока EFI_MP_SERVICES_PROTOCOL

Проверка на ноутбуке ASUS N750JK показала наличие рассматриваемой функциональности. Используемый процессор i7-4700HQ 2400MHz содержит 4 ядра, каждое из которых обеспечивает 2 логических процессора за счет технологии Hyper-Threading. Получаем такой результат:

UEFI multiprocessing features detect utility.
(C) IC Book Labs. 15.04.2015
Protocol detection status = 0000000000000000h
Protocol structure pointer = 00000000CAFB91D0h
Processors detection status = 0000000000000000h
Number of processors = 8
Number of enabled processors = 8

Нулевое значение UEFI Status указывает на отсутствие ошибок. Параметр Protocol structure pointer определяет адрес интерфейсного блока, сформированного UEFI firmware для обеспечения доступа к функциям протокола. Интерфейсный блок состоит из 64-битных указателей для вызова процедур поддержки функций.

Параметры Number of processors и Number of enabled processors содержат соответственно общее количество логических процессоров платформы и количество логических процессоров, разрешенных для использования по результатам выполнения процедуры BIOS POST. Заметим, что часть процессоров могут быть недоступны в силу установки опций CMOS Setup или вследствие возможных ошибок, обнаруженных при тестировании.

Запуск утилиты на виртуальной машине Oracle VMbox выявил отсутствие поддержки данного протокола в firmware виртуальной машины. Конфигурация рассматриваемой виртуальной машины использует один логический процессор, хотя теоретически это и не исключает поддержку функций управления мультипроцессорной системой, которые в этом случае должны возвращать количество процессоров, равное 1.


20.01.2018