Wo beginnt Linux mit der Ausführung der Quelldateien?

7

Ich würde gerne einen Teil des Quellcodes lesen, um zu verstehen, wie alles zusammenpasst, kann aber nicht sehen, wo ich anfangen soll. Welche Datei im Linux-Quellcode ist die Hauptdatei, die zum Kompilieren des Kernels verwendet wird?

Ich hatte halb damit gerechnet, eine zu finden kernel/main.c, aber es gibt viele Dateien unter kernel/und ich kann nicht sehen, welche die Hauptdatei ist? Ist es kernel/sys.c?

neelsg
quelle

Antworten:

9

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 _startBeschriftung 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 _startEtikett 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_32oder startup_64in arch/x86/kernel/head_*.SAbhängigkeit davon , ob dies ein Kernel 32-Bit oder 64-Bit ist. Nach mehr Assemblierung wird i386_start_kernelinhead32.c oder x86_64_start_kernelinhead64.c aufgerufen. Schließlich wird die architekturunabhängige start_kernelFunktion ininit/main.c aufgerufen.

start_kernelHier 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
3

Versuchen Sie es start_kernel()in /init/main.c. Dies ist die Funktion, die vom Bootloader aufgerufen wird, nachdem er einige grundlegende Funktionen wie Speicher-Paging eingerichtet hat.

Für mehr Kontext: Wikipedia Linux Startvorgang .

Superdesk
quelle