Ausführen von Code auf verschiedenen Prozessor (x86 assembly)
-
06-07-2019 - |
Frage
In Realmodus auf x86, welche Anweisungen müßte genutzt werden, um den Code auf einem anderen Prozessor ausgeführt werden, in einem Multi-Prozessor-System?
(Ich bin einen Pre-Boot-Code in Assembler schreiben, die bestimmte CPU-Register einstellen muss, und dies in dem System auf jede CPU tun, vor dem eigentlichen Betriebssystem bootet.)
Lösung
So können Sie ein eigenständiges haben (die Sie „Pre-Boot“) Programm, wie ein Bootloader, im Real-Modus laufen? Und das ist auf einem peecee mit dem üblichen BIOS?
In diesem Fall, dass Sie nur eine CPU laufen haben. Um die anderen CPU-Einheiten ein Betriebssystem zu Spin-up wird in der Regel ausführen, was heißt der universelle Start Algorithmus , die so geht:
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
Das BSP ist der Boot-Prozessor. Eine AP ist ein Anwendungsprozessor. Ein IPI ist eine Unterbrechung zwischen Prozessoren. Um eine IPI zu tun, müssen Sie den APIC, eine Interrupt-Controller Erweiterung die PC-Architektur ermöglichen, die beim Booten nicht aktiviert ist. Aus diesem Grunde ist der Code besorgt darüber, welche Art von ICU-Version er läuft. All dies ist ziemlich tief Kernel Magie. Sie könnten versuchen, auf Linux, NetBSD oder andere * BSD-Quellcode für ein Beispiel suchen, aber es wird nicht gelesen leicht zu. Wenn Sie wirklich gewinnen, könnten Sie einen kleinen Kernel oder Standalone-SMP-Testprogramm irgendwo da draußen finden.
sieheFür weitere Informationen, die Intel Multi-Prozessor-Spezifikation .