Запуск кода на другом процессоре (сборка x86)
-
06-07-2019 - |
Вопрос
В реальном режиме на x86 какие инструкции необходимо было бы использовать для запуска кода на другом процессоре в многопроцессорной системе?
(Я пишу некоторый предзагрузочный код на ассемблере, который должен установить определенные регистры процессора, и делаю это на каждом процессоре в системе перед фактической загрузкой операционной системы.)
Решение
Итак, у вас есть автономная (вы сказали "предзагрузочная") программа, похожая на загрузчик, работающая в реальном режиме?И это на PeeCee с обычным BIOS?
В этом случае у вас работает только один процессор.Для того чтобы раскрутить другие процессорные блоки, операционная система обычно выполняет то, что называется универсальный алгоритм запуска который выглядит примерно так:
BSP sends AP an INIT IPI
BSP DELAYs (10mSec)
If (APIC_VERSION is not an 82489DX) {
BSP sends AP a STARTUP IPI
BSP DELAYs (200μSEC)
BSP sends AP a STARTUP IPI
BSP DELAYs (200μSEC)
}
BSP verifies synchronization with executing AP
BSP - это загрузочный процессор.Точка доступа - это процессор приложений.IPI - это межпроцессорное прерывание.Чтобы выполнить IPI, вам необходимо включить APIC, расширение контроллера прерываний для архитектуры ПК, которое не включается при загрузке.Вот почему код беспокоится о том, какую версию ICU он запускает.Все это довольно глубокая магия ядра.Вы можете попробовать посмотреть на Linux, NetBSD или другой исходный код * BSD в качестве примера, но это будет нелегко прочитать.Если вы действительно выиграете, вы можете найти где-нибудь небольшое ядро или автономную программу тестирования SMP.
Для получения дополнительной информации смотрите Спецификация многопроцессора Intel.