Der init-Prozeß

Wenn start_kernel den init-Thread startet (der von der Funktion init in init/main.c implementiert wird), läuft die Funktion immer noch im Kernel-Modus, und damit auch der init-Thread. Wenn alle oben beschriebenen Initialisierungen erledigt sind, gibt der Thread die Kernel-Sperre auf und bereitet sich auf die Ausführung des init-Prozesses im User-Space vor. Die auszuführende Datei steht in /sbin/init, /etc/init oder /bin/init. Wenn keine dieser Dateien gefunden wird, wird /bin/sh als Notmaßnahme gestartet, damit eine eventuell zerstörte init-Datei wiederhergestellt werden kann. Als Alternative dazu kann der Benutzer auf der Kommandozeile angeben, welches init-Programm der init-Thread ausführen soll.

Der Eintritt in den User-Space ist einfach. Der Code öffnet /dev/console als Standardeingabe durch Aufrufen des Systemaufrufs open und verbindet die Konsole durch Aufrufen von dup mit stdout und stderr; schließlich wird execve verwendet, um das User Space-Programm auszuführen.

Der Thread kann Systemaufrufe vom Kernel-Modus aus aufrufen, weil init/main.c vor dem Einbinden von <asm/unistd.h> __KERNEL_SYSCALLS__ deklariert hat. Die Header-Datei definiert speziellen Code, mit dem Kernel-Code eine begrenzte Anzahl von Systemaufrufen genau wie der User-Space verwenden kann. Weitere Informationen zu Kernel-Systemaufrufen finden Sie in http://www.linux.it/kerneldocs/ksys.

Der Aufruf von execve beendet den Übergang in den User-Space. Daran ist überhaupt nichts Geheimnisvolles. Wie jeder andere execve-Aufruf in Unix ersetzt auch dieser die Speichertabellen des aktuellen Prozesses durch neue, die von der ausgeführten Binärdatei definiert werden (Sie werden sich erinnern, daß das Ausführen einer Datei bedeutet, daß sie in den virtuellen Adreßraum des aktuellen Prozesses eingeblendet wird). Es spielt keine Rolle, daß der aufrufende Prozeß in diesem Fall im Kernel-Space läuft. Dies ist für die Implementation von execve transparent, die einfach nur feststellt, daß es keine vorherigen Speichertabellen freizugeben gibt, bevor die neuen aktiviert werden.

Wie auch immer das System eingerichtet war und die Kommandozeile aussah, jetzt wird der init-Prozeß im User Space ausgeführt, und alle weiteren Kernel-Operationen erfolgen als Antwort auf Systemaufrufe von init selbst oder von Prozessen, die von init gestartet werden.

Weitere Informationen darüber, wie der init-Prozeß das gesamte System hochfährt, finden Sie in http://www.linux.it/kerneldocs/init. Wir machen jetzt mit unserer Tour weiter, indem wir uns die in den einzelnen Verzeichnissen implementierten Systemaufrufe anschauen sowie dann einen Blick darauf werfen, wie die Gerätetreiber im Quellbaum organisiert sind.