Запуск кода на другом процессоре (сборка x86)

В реальном режиме на x86, какие инструкции нужно использовать для запуска кода на другом процессоре в многопроцессорной системе?

(Я пишу некоторый код предварительной загрузки в ассемблере, который должен установить определенные регистры процессора, и делать это на каждом процессоре в системе до того, как загрузится реальная операционная система.)

Ответ 1

Итак, у вас есть автономная (вы сказали "pre-boot" ) программа, как загрузчик, работающая в реальном режиме? И это на 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 - это загрузочный процессор. AP является прикладным процессором. IPI - это межпроцессорное прерывание. Чтобы сделать IPI, вам необходимо включить APIC, расширение контроллера прерываний для архитектуры ПК, которое не включено при загрузке. Именно поэтому код беспокоится о том, какая версия ICU работает. Все это довольно глубокая ядерная магия. Вы можете попробовать посмотреть на Linux, NetBSD или на другой исходный код BSD для примера, но читать его будет непросто. Если вы действительно выиграете, вы можете найти небольшое ядро ​​или автономную тестовую программу SMP где-то там.

Для получения дополнительной информации см. Спецификация многопроцессора Intel.