[Linux] Detaillierte Erläuterung des Init-Prozesses

Überblick

Hinweis: init进程和init程序(linuxrc程序)是有区别的. Der Init-Prozess existiert von Anfang an, er wird im Kernel-Status ausgeführt und gehört zu einem Kernel-Thread. Später, nachdem der Init-Prozess das Root-Dateisystem gemountet und das Anwendungs-Init-Programm ausgeführt hat, wechselt der Init-Prozess vom Kernel-Status in den Benutzerstatus. Da sich die Prozessnummer während des Transformationsprozesses nicht geändert hat, handelt es sich immer noch um Prozess 1, sodass einige Leute das Init-Programm (Linuxrc-Programm) als Prozess 1 betrachten. Tatsächlich umfasst der Init-Prozess jedoch neben dem späteren Init-Programm auch Vorgänge wie das Mounten des Root-Dateisystems im Kernel-Modus.

Der Init-Prozess schließt den Übergang vom Kernelmodus in den Benutzermodus ab

Fügen Sie hier eine Bildbeschreibung ein
Aus der obigen Abbildung können Sie ersehen, dass Init zuerst vom Kernel-Space aus ausgeführt wird und dann zum Ausführen in den User-Space wechselt

(1) Ein Prozess hat nacheinander zwei Zustände

Als der Init-Prozess zum ersten Mal ausgeführt wurde, befand er sich im Kernel-Status, der zu einem Kernel-Thread gehörte, und nachdem er ein Programm im Benutzerstatus ausgeführt hatte, konvertierte er sich zwangsweise in den Benutzerstatus (die folgenden Prozesse müssen im ausgeführt werden). Benutzerstatus).
Der Init-Prozess schließt den Übergang vom Kernelmodus in den Benutzermodus ab, sodass andere nachfolgende Prozesse im Benutzermodus arbeiten können.

(2) Der Arbeitsinhalt des Init-Prozesses im Kernelmodus

主要是挂载根文件系统,并试图找到用户态下的那个init程序. (Dieser Satz zeigt, dass der Init-Prozess früher ausgeführt wird als das Init-Programm.)

Der Init-Prozess muss ein Anwendungsprogramm im Benutzermodus ausführen, wenn er sich in den Benutzermodus konvertieren möchte. Um dieses Anwendungsprogramm auszuführen, muss er dieses Anwendungsprogramm finden. Um dieses Anwendungsprogramm zu finden, muss er das Root-Dateisystem mounten, weil alle Anwendungen Programme befinden sich alle im Dateisystem.

Alle Funktionen im Kernel-Quellcode befinden sich im Kernel-Status und keine von ihnen kann außerhalb des Kernel-Status ausgeführt werden. Das Anwendungsprogramm darf nicht zum Kernel-Quellcode gehören, um sicherzustellen, dass sich das Anwendungsprogramm im Benutzermodus befindet. Das hier ausgeführte Init-Programm gehört nicht zum Kernel und wird separat vom Root-Dateisystem bereitgestellt.

(3) Der Arbeitsinhalt des Init-Prozesses im Benutzermodus

Der Großteil der sinnvollen Arbeit des Init-Prozesses wird im Benutzermodus ausgeführt.
Die Bedeutung des Init-Prozesses für das Betriebssystem besteht darin, dass

Alle anderen Benutzerprozesse werden direkt oder indirekt vom Init-Prozess abgeleitet

(4) Wie springt der Init-Prozess vom Kernel-Modus in den Benutzermodus? Kannst du zurückkommen?

init进程处于内核态时,通过函数kernel_execve来执行一个用户空间编译链接的应用程序就跳跃到用户态了

  • Die Prozessnummer ändert sich beim Sprung nicht, es ist immer Prozess 1.
  • Der Sprungvorgang ist einseitig. Sobald das Init-Programm ausgeführt und in den Benutzermodus übertragen wird, wird das gesamte Betriebssystem tatsächlich ausgeführt und kann in Zukunft nur noch im Benutzermodus ausgeführt werden. Wenn Sie in den Kernelmodus wechseln möchten Im Benutzermodus können Sie nur die API aufrufen.
  • Der Sprungvorgang ist 单向ja, sobald das Init-Programm ausgeführt und in den Benutzermodus übertragen wird, läuft das gesamte Betriebssystem tatsächlich und kann in Zukunft nur noch im Benutzermodus ausgeführt werden. Wenn Sie in den Kernelmodus wechseln möchten Im Benutzermodus können Sie nur die API aufrufen.

1. Der Init-Prozess mountet das Root-Dateisystem

(1) Die Funktion „prepare_namespace“ mountet das Root-Dateisystem.

(2) Wo ist das Root-Dateisystem? Was ist der Dateisystemtyp des Root-Dateisystems?

Uboot teilt dem Kernel diese Informationen durch Übergabe von Parametern mit.
Der Satz root=/dev/mmcblk0p2 rw im Parameter uboot soll dem Kernel mitteilen, wo sich das Root-Dateisystem befindet.
Der Satz rootfstype=ext3 im Parameter uboot soll dem Kernel den Typ von rootfs mitteilen.

(3) Mount-Ergebnis
Fügen Sie hier eine Bildbeschreibung ein
Wenn der Kernel das Root-Dateisystem erfolgreich mountet, wird Folgendes gedruckt: VFS: Root (ext3-Dateisystem) auf Gerät 179:2 gemountet. (Möglicherweise sind auch andere Zahlen möglich.)
Wenn das Root-Dateisystem nicht gemountet werden kann, wird Folgendes ausgegeben: Kein Dateisystem konnte Root mounten, versucht: yaffs2
(4) Wenn das Root-Dateisystem beim Starten des Kernels nicht gemountet werden kann, kann es später nicht ausgeführt werden.

Der Kernel hat einen Mechanismus eingerichtet, um nach einer Pause von 5 Sekunden nach einem Startfehler automatisch neu zu starten. Daher wird er hier automatisch neu gestartet, sodass es manchmal zu wiederholten Neustarts kommt.
(5) Wenn das Mounten von rootfs fehlschlägt, kann das folgende Gründe haben:

Der häufigste Fehler ist, dass die Bootargs von uboot nicht richtig eingestellt sind.
Das Brennen von Rootfs ist fehlgeschlagen (Fastboot-Brennen ist nicht leicht, Fehler zu machen).
Rootfs selbst schafft es nicht.

2. Der Init-Prozess führt das Init-Programm aus, um den Übergang vom Kernel-Status zum Benutzerstatus abzuschließen

Fügen Sie hier eine Bildbeschreibung ein

(1) Sobald das Rootfs erfolgreich gemountet wurde, geben Sie das Rootfs ein, um das Init-Programm der Anwendung zu finden (in der Funktion init_post()) und führen Sie es mit run_init_process aus, nachdem Sie es gefunden haben.

(2) Wenn Sie feststellen, wer das Init-Programm ist?

Überprüfen Sie zunächst, ob es im Uboot-Parameter cmdline angegeben ist. Wenn es angegeben ist, führen Sie zuerst das in der cmdline angegebene Programm aus. Init=/linuxrc bedeutet beispielsweise, dass das Linuxrc-Programm im Stammverzeichnis von rootfs das Init-Programm ist.
Wenn im uboot-Parameter cmdline kein init=xx steht oder die Ausführung des in der cmdline angegebenen xx fehlschlägt, gibt es eine Backup-Lösung. Das erste Backup: /sbin/init, das zweite Backup: /etc/init, das dritte Backup: /bin/init, das vierte Backup: /bin/sh. Wenn keiner der oben genannten Punkte erfolgreich ist, gibt es keinen anderen Weg.
init=/linuxrc verweist im Allgemeinen auf Busybox.

3. Der Init-Prozess erstellt die Benutzeroberfläche

(1) Der Init-Prozess ist der Vorfahre anderer Benutzerprozesse.

Die Erstellung eines Prozesses im Linux-System erfolgt über seinen übergeordneten Prozess. Nach dieser Theorie können, solange es einen Elternprozess gibt, eine Reihe von Nachkommenprozessen entstehen.
(2) init startet den Anmeldeprozess (Benutzeranmeldeprozess), den Befehlszeilenprozess (stellt eine Befehlszeilenumgebung bereit) und den Shell-Prozess (stellt Befehlsinterpretation und -ausführung bereit).

(3) Der Shell-Prozess startet andere Benutzerprozesse.

Sobald die Befehlszeile und die Shell funktionieren, kann der Benutzer andere Anwendungen über die ./xx-Methode unter der Befehlszeile ausführen, und der Betrieb jeder Anwendung ist ein Prozess.

4. Der Init-Prozess öffnet die Konsole

Fügen Sie hier eine Bildbeschreibung ein
(1) Jeder Prozess im Linux-System verfügt über eine eigene Dateideskriptortabelle, in der die vom Prozess geöffneten Dateien gespeichert werden.

(2) Alles im Linux-System ist eine Datei, sodass auf das Gerät auch als Datei zugegriffen wird. Um auf ein Gerät zuzugreifen, muss der dem Gerät entsprechende Dateideskriptor geöffnet werden. Beispielsweise repräsentiert die Gerätedatei /dev/fb0 das LCD-Anzeigegerät, /dev/buzzer das Summergerät und /dev/console das Konsolengerät.

(3) Hier wird die Datei /dev/console geöffnet, der Dateideskriptor zweimal kopiert und insgesamt 3 Dateideskriptoren erhalten. Diese drei Dateideskriptoren sind 0, 1 und 2, die sogenannte Standardeingabe, Standardausgabe und Standardfehler.

(4) Prozess 1 öffnet diese 3 Dateideskriptoren, sodass alle von Prozess 1 abgeleiteten Prozesse standardmäßig über diese 3 Dateideskriptoren verfügen.

Referenz

Detaillierte Erläuterung des Init-Prozesses.
Analyse des Init-Prozesses der Linux-Startprozessanalyse

Ich denke du magst

Origin blog.csdn.net/m0_45406092/article/details/130660743
Empfohlen
Rangfolge