Запуск кода на другом процессоре (сборка x86) - PullRequest
10 голосов
/ 26 октября 2009

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

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

1 Ответ

9 голосов
/ 26 октября 2009

Итак, у вас есть отдельная (вы сказали «предзагрузочная») программа, как загрузчик, работающая в реальном режиме? И это на 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 .

...