next up previous contents index
Next: init Up: Das System starten Previous: Von Festplatte booten

Die Vorgänge bei der Systeminitialisierung

 

Seit der Version 0.99.12 sind alle Kernel komprimiert gespeichertgif und entpacken sich nach dem Laden selbsttätig im Arbeitsspeicher. Wenn der Kernel ausgepackt und an die richtige Stelle (virtueller Adreßraum ab 3 GB) gerückt ist, springt der Programmzähler auf die Startadresse der Kernels, der damit die Kontrolle über den Rechner übernimmt.

Die Systeminitialisierung kann grob in zwei Phasen unterteilt werden. Die erste Phase wird von der Kerneldatei allein und weitgehend ohne Einfluß der Systemverwalterin durchgeführt und dient der Erkennung und Initialisierung der Komponenten sowie der Geräte bzw. der Gerätetreiber. Zum Abschluß der ersten Phase wird die ''Benutzerebene'' des Betriebssystems eröffnet und in der damit beginnenden zweiten Phase ganz bestimmte Programme automatisch ausgeführt.

Auch wenn Sie die meisten Vorgänge der ersten Phase nicht direkt beeinflussen können, ist es gut, wenn Sie einmal die verschiedenen Schritte nachverfolgen und vor allem die Bildschirmausgabe bei der Systeminitialisierung verstehen. Besonders, wenn Ihr Linux-Kernel nicht mit der speziellen Hardwarekonstellation Ihres Rechners zusammenarbeiten will, finden Sie in den Zeilen des Boot-Bildschirms meistens die entscheidenden Hinweise zur Eingrenzung des Problems, mit denen Sie es schließlich beheben können.

Die Initialisierung des Kernels findet in der Funktion start_kernel(9) (die Sie in den Kernelsourcen in der Datei ./linux/init/main.c finden können) statt und läuft in den folgenden Schritten ab:

Zuerst werden die internen Funktionen und Tabellen des Kernels initialisiert. Dazu gehören die Tabelle zur Speicherseitenverwaltung, die Belegung der Fehlerinterrupts und der IRQ, die Einrichtung der Prozeßtabelle und der Start der Schedulers. Dabei findet noch keine Bildschirmausgabe statt.

Dann wird die Kommandozeile des Kernels ausgewertet. Dabei können verschiedene Parameter für die Initialisierung der Gerätetreiber verändert werden. Die von der Linux-Version 1.0 unterstützten Kommandozeilenargumente sind auf Seite gif erklärt.

Nach der Auswertung der Kommandozeile beginnt die Initialisierung der Gerätetreiber. Zuerst werden die zeichenorientierten Geräte initialisiert.

Die Systemconsole wird als erstes eingerichtet; danach können die Kernelmeldungen auf dem Bildschirm erscheinen. Wenn für den Textbildschirm kein fester Video-Modus eingestellt wurde, wird an dieser Stelle eine Liste aller von der Grafikkarte unterstützten Modi ausgegeben und auf eine Auswahl gewartet.

Als nächstes werden die normalenßeriellen Schnittstellen initialisiert. Schnittstellenkarten mit zwei Standard-Ports werden von jedem Linux-Kernel ohne Probleme erkannt. Die 16550A-Schnittstellenbausteine werden unterstützt. Zusätzliche serielle Schnittstellen oder vom Standard abweichende Konfigurationen werden nicht initialisiert. Die Treiber sind aber ohne weiteres in der Lage, auch mit diesen Geräten umzugehen, wenn sie mit dem setserial-Programm zur Laufzeit des Kernels konfiguriert und initialisiert worden sind.

Im nächsten Schritt sucht und initialisiert der Kernel die parallele(n) Druckerschnittstelle(n), danach werden eventuell eingebundene Busmaus-Treiber sowie die Audio-Devices initialisiert. Zum Abschluß der Initialisierung zeichenorientierter Geräte wird gegebenenfalls der Treiber für den QIC-02 Streamer vorbereitet.

Bei der Treiberinitialisierung für blockorientierte Geräte wird für die Gerätetreiber der normalen'' Festplatten Kernelspeicher reserviert, es findet aber noch kein Festplattenzugriff statt. In den nächsten Schritten werden gegebenenfalls die Treiber für den XT-Controller und die Mitsumi- und Sony-CD-ROM-Laufwerke initialisiert. Bei der Übersetzung des Kernels mit dem rdev-Programm oder mit einem LILO-Konfigurationsparameter kann der Kernel veranlaßt werden, einen Speicherbereich bestimmter Größe als RAM-Disk anzulegen. Die Initialisierung des entsprechenden Gerätetreibers findet an dieser Stelle statt.

Danach sucht der Kernel nach SCSI Hostadaptern, und wenn er welche gefunden hat, wird nach SCSI Geräten gesucht.gif Auch hier werden einigermaßen unkomplizierte Konfigurationen automatisch erkannt. Wenn es Probleme mit einem Hostadapter oder einer Festplatte gibt, die prinzipiell unterstützt wird, aber in der Konfiguration nicht korrekt erkannt wird, können einige Treiber auf der Kommandozeile des Kernels konfiguriert werden, um das Problem zu lösen (-> S. gif).

In den weiteren Schritten werden der Arbeitsspeicher und eine Reihe von internen Tabellen und Parametern initialisiert, ohne daß es auf dem Bildschirm dokumentiert wird.

Dann werden die Diskettenlaufwerke gesucht und initialisiert.

    Im nächsten Schritt werden die Sockets für den Kernel und die TCP/IP-Treiber eingerichtet. Eine vorhandene Ethernetkarte wird an dieser Stelle initialisiert ist aber für die Funktion der TCP/IP-Protokolle nicht unbedingt notwendig. In jedem Fall wird ein Loopback-Device eingerichtet, mit dem die verschiedenen Netzwerkprogramme auf dem lokalen Rechner arbeiten können.

Schließlich werden noch gegebenenfalls die Kernelroutinen für die Inter-Prozeß-Kommunikation (IPC) und den mathematischen Coprozessor eingeschaltet.

Mit diesen Schritten ist die erste Phase der Systeminitialisierung beendet. Auf dem Startbildschirm wird an dieser Stelle der ''Linux-Banneräusgegeben, in dem die Versionsnummer und das Übersetzungsdatum des nun laufenden Kernels enthalten sind.

An dieser Stelle ist der Kernel im Prinzip arbeitsfähig. In der nun folgenden zweiten Phase wird das Benutzersystem initialisiert. Die Unterscheidung zwischen Kernel- und Benutzerbereich ist eines der mächtigsten Konzepte, das Linux von Unix übernommen hat. Während der Kernel die vollständige Kontrolle über den Rechner hat und alle technisch möglichen Operationen ausführen kann/darf, befinden sich Benutzerprozesse immer unter der Aufsicht des Kernels.

Um das Benutzersystem zum Leben zu erwecken, wechselt der Kernel das erste Mal in den Benutzermodus und startet die ersten beiden Prozesse (Tasks).

Die Numerierung der Prozesse beginnt mit 0. Der nullte'' Task des Kernels ist der idle-Prozeß, der immer lauffähig ist und vom Scheduler aufgerufen wird, wenn kein anderer Prozeß Rechenzeit braucht.



next up previous contents index
Next: init Up: Das System starten Previous: Von Festplatte booten



Linux Anwenderhandbuch -- Copyright 1993, 1994, 1995 S. Hetze, D. Hohndel, O. Kirch, M. Müller