Was sind die beiden head.S-Dateien im Linux-Quellcode?

Was sind die beiden head.S-Dateien im Linux-Quellcode?

Im Linux-Quellcode gibt es zwei verschiedene head.S-Dateien an folgendem Speicherort:

Bogen/Arm/Kern/Kopf.S

Bogen/Arm/Stiefel/zusammengedrückt/Kopf.S

Was ist der Zweck jedes einzelnen und in welcher Reihenfolge erfolgt seine Ausführung?

Antwort1

Ich freue mich über bessere Antworten, aber meines Wissens handelt es sich dabei um den in Assembler handgeschriebenen Kernel-Startcode (der architekturspezifisch ist). (Denken Sie daran, dass wir an diesem Punkt nur eine Bare-Metal-CPU und Rohzugriff auf den Speicher haben; wir können nicht auf komplexe Bibliotheken zugreifen, die im Dateisystem gespeichert sind, weil wir noch keinen Dateimanager haben – das ist, als würde man fragen, wer den Urknall verursacht hat.) Verwechseln Sie dies nicht mit dem Bootloader (der den Bootsektor von der Festplatte in den RAM lädt). Ich selbst hatte sie in meiner früheren Antwort verwechselt.

             +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
             ' bootloader                                                                 '     ' kernel                                                                        '
             '                                                                            '     '                                                                               '
+------+     ' +-----------------------------------+     +------------------------------+ '     ' +-----------------------------+     +---------------------------------------+ '
| BIOS | --> ' | arch/x86/boot/header.S::call main | --> | arch/x86/boot/main.c::main() | ' --> ' | init/main.c::start_kernel() | --> | arch/x86/kernel/setup.c::setup_arch() | '
+------+     ' +-----------------------------------+     +------------------------------+ '     ' +-----------------------------+     +---------------------------------------+ '
             '                                                                            '     '                                                                               '
             +- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +     + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

(EDIT: das ist Minix, ich habe es ursprünglich falsch eingegeben)

+------+     +--------------------+     +------------------+     +------------------------+
| BIOS | --> | Bootloader (mbr.S) | --> | startup (head.S) | --> | kernel/main.c::kmain() |
+------+     +--------------------+     +------------------+     +------------------------+

Bildbeschreibung hier eingeben

Am Ende von head.S sehen Sie die Zeile

    call    _C_LABEL(kmain)

Dies ist der Einstiegspunkt zum Kernel:

kernel/main.c

Ich glaube, head.Ses wird beim Kompilieren oben an das Kernel-Image angehängt. Das BIOS weiß, dass dieser Codeblock ausgeführt werden muss, da er ganz am Anfang steht und das Stammdateisystem der RAM-Disk ist.

Warum es einen komprimierten und einen unkomprimierten Teil gibt, liegt meiner Meinung nach daran, dass kein Programmierer die nötigen Kenntnisse besitzt, um den architekturspezifischen Assemblerteil des Kernel-Images zu komprimieren. Sobald wir zu der kmainin C geschriebenen (aber in Assembler kompilierten) Routine springen können, haben wir Zugriff auf eine Dekomprimierungsroutine, die den Kernel-Footprint deutlich verkleinert.

Bildbeschreibung hier eingeben

http://duartes.org/gustavo/blog/post/kernel-boot-process/


Der Einstiegspunkt mit Assembly

Wir schreiben gerne alles in C, aber ein bisschen Assembler kommen wir nicht umhin. Wir schreiben eine kleine Datei in der x86-Assemblersprache, die als Ausgangspunkt für unseren Kernel dient. Unsere Assemblerdatei ruft lediglich eine externe Funktion auf, die wir in C schreiben, und hält dann den Programmfluss an.

Wie stellen wir sicher, dass dieser Assemblercode als Ausgangspunkt des Kernels dient?

Wir verwenden ein Linker-Skript, das die Objektdateien verknüpft, um die endgültige ausführbare Kerneldatei zu erstellen. (Weitere Erklärungen folgen später.) In diesem Linker-Skript geben wir explizit an, dass unsere Binärdatei an der Adresse 0x100000 geladen werden soll. An dieser Adresse wird, wie ich bereits sagte, der Kernel erwartet. Der Bootloader kümmert sich also darum, den Einstiegspunkt des Kernels auszulösen.

http://arjunsreedharan.org/post/82710718100/kernel-101-lets-write-a-kernel

verwandte Informationen