Запуск кода на другом процессоре (сборка x86)
В реальном режиме на x86, какие инструкции необходимо использовать для запуска кода на другом процессоре, в многопроцессорной системе?
(Я пишу некоторый предзагрузочный код на ассемблере, который должен установить определенные регистры ЦП, и сделать это на каждом ЦП в системе, до того, как фактическая операционная система загрузится.)
1 ответ
Итак, у вас есть отдельная (вы сказали "предзагрузочная") программа, как загрузчик, работающая в реальном режиме? И это на 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.