Die Übergabe vom Bootloader an den Kernel erfordert zwangsläufig einige architekturspezifische Überlegungen wie Speicheradressen und Registernutzung. Folglich befindet sich der Ort, an dem gesucht werden muss, in den architekturspezifischen Verzeichnissen ( arch/*
). Darüber hinaus beinhaltet die Übergabe vom Bootloader ein genaues Registerverwendungsprotokoll, das wahrscheinlich in Assembler implementiert wird. Der Kernel hat auf einigen Architekturen sogar unterschiedliche Einstiegspunkte für unterschiedliche Bootloader.
Auf x86 befindet sich beispielsweise der Einstiegspunkt in arch/x86/boot/header.S
(ich kenne keine anderen Einstiegspunkte, bin mir aber nicht sicher, ob es keine gibt). Der eigentliche Einstiegspunkt ist die _start
Beschriftung am Offset 512 in der Binärdatei . Die 512 Bytes davor können verwendet werden, um einen Master-Boot-Datensatz für ein IBM PC-kompatibles BIOS zu erstellen (früher konnte ein Kernel auf diese Weise booten, aber jetzt zeigt dieser Teil nur eine Fehlermeldung an). Das _start
Etikett beginnt eine ziemlich lange Verarbeitung im Real-Modus , zuerst in der Montage und dann in main.c
. Irgendwann wechselt der Initialisierungscode in den geschützten Modus . Ich denke, dies ist der Punkt, an dem die Dekomprimierung stattfindet, wenn der Kernel komprimiert wird;; erreicht dann Steuerung startup_32
oder startup_64
in arch/x86/kernel/head_*.S
Abhängigkeit davon , ob dies ein Kernel 32-Bit oder 64-Bit ist. Nach mehr Assemblierung wird i386_start_kernel
inhead32.c
oder x86_64_start_kernel
inhead64.c
aufgerufen. Schließlich wird die architekturunabhängige start_kernel
Funktion ininit/main.c
aufgerufen.
start_kernel
Hier beginnt der Kernel, sich auf die reale Welt vorzubereiten. Beim Start gibt es nur eine einzige CPU und etwas Speicher (bei virtuellem Speicher ist die MMU zu diesem Zeitpunkt bereits eingeschaltet). Der dortige Code richtet Speicherzuordnungen ein, initialisiert alle Subsysteme, richtet Interrupt-Handler ein, startet den Scheduler, damit Threads erstellt werden können, beginnt mit der Interaktion mit Peripheriegeräten usw.
Der Kernel hat andere Einstiegspunkte als den Bootloader: Einstiegspunkte beim Aktivieren eines Kerns auf einer Multi-Core-CPU, Interrupt-Handler, Systemaufruf-Handler, Fehlerhandler,…
Gilles 'SO - hör auf böse zu sein'
quelle