Согласно спецификации Unified Extensible Firmware Interface, программная среда, обеспечивающая выполнение процедур инициализации перед загрузкой операционной системы, не поддерживает многопоточную обработку.
Основная причина — однопоточная идеология UEFI и, как следствие, нереентерабельность сервисных процедур UEFI API. В то же время ряд задач, не связанных с вызовом сервисных функций (например, тестирование оперативной памяти), не только допускают параллельное выполнение несколькими потоками программы, но и получают от такого подхода прирост производительности.
Примечание : несколько лет назад в нашей лаборатории проводились эксперименты по инициализации многопроцессорной платформы в 16-битной среде MS-DOS с использованием прямого программирования аппаратных ресурсов, в частности контроллеров прерываний Local APIC. Эксперимент, удачный с технической точки зрения, тем не менее оказался чем-то похож на анекдот о дрессировщике, который научил собаку играть на скрипке, а зрители, как оказалось, не пошли в цирк слушать.
на скрипичный концерт. Наличие в прошивке UEFI документированного набора сервисных функций, называемых EFI_MP_SERVICES_PROTOCOL предполагает, что судьба многопоточной обработки под UEFI будет несколько иной.
Давайте подробнее рассмотрим одну из функций этого протокола.
Запуск АП: как это делается
Рассмотрим набор параметров и принципы использования одной из основных функций.StartupThisAP , обеспечивающий запуск AP (Application Processors) многопроцессорной системы и координацию их работы BSP (Bootstrap Processor).
Описание функции StartupThisAP в спецификации инициализации платформы UEFI. Том 2. Основной интерфейс среды выполнения драйверов.
Версия 1.3. Функция позволяет запустить произвольную процедуру на заданном логическом процессоре многопроцессорной платформы.
Объект управления – это логические процессоры , например, в системе с двумя 8-ядерными процессорами, поддерживающими Технология гиперпоточности , количество логических процессоров будет равно 2*8*2 = 32. Чтобы запросить количество процессоров, используйте функцию GetNumberOfProcessors , пример использования которого приведен в описании Утилиты обнаружения SMP .
Итак, функция StartupThisAP принимает 7 параметров.
- EFI_MP_SERVICES_PROTOCOL – указатель на интерфейсный блок вызываемого протокола, возвращаемый функцией EFI_Locate_Protocol.
- EFI_AP_PROCEDURE – указатель на процедуру, которую должен выполнить процессор AP. Процедура должна быть предварительно подготовлена в памяти в соответствии с правилами текущего режима работы процессора, например, для UEFI x64 используется соглашение о вызовах Microsoft x64.
- Номер процессора – номер запускаемого процессора, считая с 0.
- WaitEvent – номер (дескриптор) события, зарезервированного вызывающей процедурой.
Вызванная процедура генерирует это событие, чтобы сообщить об успешном завершении подпрограммы на процессоре AP или об истечении таймаута.
Особым случаем является то, что нулевое значение этого параметра означает, что процессор BSP, запустивший процедуру на процессоре AP, должен дождаться завершения этой процедуры, прежде чем вернуться из функции.
В этом случае никаких событий не генерируется.
Этот режим называется режимом блокировки.
- ТаймаутИнмикросекунды – значение таймаута в микросекундах, определяющее время ожидания завершения процедуры, выполняемой на процессоре AP. По истечении времени ожидания процедура принудительно завершается и генерируется ошибка.
Нулевое значение этого параметра означает отсутствие ограничения по времени для процедуры (бесконечное ожидание).
- ПроцедураАргумент – параметр, передаваемый процедуре, запущенной на процессоре ТД.
Нулевое значение означает, что передача параметров не используется.
- Законченный – указатель на переменную, для которой прошивкой UEFI установлено значение TRUE, если процедура, запущенная на точке доступа, завершилась успешно до истечения таймаута.
Нулевое значение означает, что такая переменная не используется.
Краткое содержание
Можно констатировать, что по сравнению с Legacy BIOS прошивка UEFI существенно упрощает задачу системного программиста при инициализации многопроцессорной платформы.Передача межпроцессорных прерываний, известных как IPI или Inter Processor Interrupts, а также переключение процессора AP в режим, совместимый с контекстом UEFI, можно осуществлять не путем прямого аппаратного программирования, а с помощью сервисных функций.
Исключением могут быть задачи, в которых ресурсы платформы, обеспечивающие поддержку многопроцессорности, являются самостоятельным объектом исследования или диагностики.
Приложение
УПД.Картинка заменена: изначально была ошибка в структуре блока интерфейса EFI_MP_SERVICES_PROTOCOL Теги: #UEFI #smp #Ненормальное программирование #UEFI
-
Котарбиньский, Тадеуш
19 Oct, 24 -
С Чего Начинается Стартап? Часть 2
19 Oct, 24 -
Началось Голосование За Отчеты Yiiconf
19 Oct, 24 -
Расширение Opera: Радио
19 Oct, 24 -
Евросеть Дарит Женщинам-Правителям (Об Нло)
19 Oct, 24