Ich lerne Gerätetreiber und Kernelprogrammierung. Laut Jonathan Corbets Buch gibt es main()
in Gerätetreibern keine Funktion.
Also ich zwei Fragen:
- Warum brauchen wir keine
main()
Funktion in Gerätetreibern? - Hat der Kernel selbst eine
main()
Funktion?
Kann mir das jemand erklären?
linux-kernel
drivers
jemand
quelle
quelle
Antworten:
In User-Space-Programmen
main()
ist dies der Einstiegspunkt für das Programm, das vom libc-Initialisierungscode aufgerufen wird, wenn die Binärdatei ausgeführt wird. Kernel-Code hat nicht den Luxus, sich auf libc zu verlassen, da libc selbst auf die Kernel-Syscall-Schnittstelle für Speicherzuweisung, E / A, Prozessverwaltung usw. angewiesen ist.Das Äquivalent zu
main()
im Kernel enthaltenem Code iststart_kernel()
, der vom Bootloader aufgerufen wird, nachdem das Kernel-Image geladen, in den Speicher dekomprimiert und wichtige Hardware und Speicherseiten eingerichtet wurde.start_kernel()
Führt den größten Teil der Systemeinrichtung aus und startet schließlich den Init-Prozess.Der Einstiegspunkt für Linux-Kernelmodule ist eine Init-Funktion, die durch Aufrufen des
module_init()
Makros beim Kernel registriert wird . Die registrierte Modulinitialisierungsfunktion wird dann durch den Kernelcode über diedo_initcalls()
Funktion während des Kernelstarts aufgerufen .quelle
main
Methode in C erkannt haben . (Es ist ein allzu weit verbreitetes Missverständnis, dass das Betriebssystem direkt anruftmain
, was in C ++ nicht der Fall und noch weniger der Fall ist.) I ' Ich würde dir noch eine Gegenstimme geben, wenn ich nur dafür könnte.Der Kernel hat keine
main
Funktion.main
ist ein Konzept der C-Sprache. Der Kernel ist in C und Assembly geschrieben. Der Eintrittscode des Kernels wird von der Assembly geschrieben.Die Startsequenz ist wie folgt organisiert:
initrd
). Dann wird Code an irgendeiner Adresse ausgeführt.init
Prozess), schaltet den Kontext der CPU von Ring 0 auf Ring 3 um und startet den Init-Prozess (die Prozess-ID ist 1). Jetzt ist der Kernel-Boot fertig!init
Programm führt alle Init-Skripte aus. Alle Dienste werden gestartet. Shell heißt. Benutzer können sich anmelden.Die
main
Funktion ist eine C-Funktion. Tatsächlich ist die Hauptmethode nicht der Einstiegspunkt von C-Programmen. Die C-Laufzeit ruft viele Funktionen vorher aufmain
. GCC hat eine erweiterte Funktion: Konstruktoren. Als "Konstruktor" deklarierte Funktionen werden vorher aufgerufenmain
.Zum Beispiel:
Dieses Makro stammt aus dem qemu-Projekt.
quelle
initrd.img
IST NICHT das Kernel-Image. Es ist eine Reihe von Modulen, die vom Kernel beim Booten geladen werden. Kernel-Images haben normalerweise Namen, die mit "vmlinuz" beginnen, unterscheiden sich jedoch von Distribution zu Distribution.Es gibt z. B. eine main () - Funktion in arch / x86 / boot / main.c, um das System auf den Wechsel vom realen in den geschützten Modus vorzubereiten, aber andere Architekturen haben keinen solchen Code. Es gibt einen schönen Überblick darüber, wie das Booten des Linux-Kernels 2.6.x auf der x86-Plattform funktioniert. Es lohnt sich wirklich, es zu lesen.
Laut dem Dokument HOWTO do Linux Kernel Development handelt es sich um den Linux Kernel
Was bedeutet das nach dem C-Standard BTW?
quelle