Вопрос

В реальном режиме на 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top