Kernel

Willemers Informatik-Ecke

Betriebssystem

Der Kernel von UNIX könnte als das Hauptprogramm des Betriebssystems bezeichnet werden. In der klassischen Variante enthält er alles, was zum Betriebssystem gehört, vom Prozessmanager (dem Scheduler), über Speicherverwaltung, Dateisystem bis hin zu den Gerätetreibern war alles ein einziges Programm. In den Anfangstagen von UNIX lag das Betriebssystem als Source vor und es wurde vom Administrator an die Bedürfnisse seiner Umgebung angepasst. Anschließend wurde es mit dem mitgelieferten C-Compiler übersetzt. Die Konstanten, die das Laufzeitverhalten prägten, wurden an die Einsatzumgebung der Maschine angepasst und die benötigten Treiber ausgewählt und danach ein Kernel gebildet (Eigentlich müsste es korrekt "Kernel bauen" heißen, da es sich vom englischen Wort build herleitet. Inzwischen ist "bilden" bereits so tradiert, dass es nur noch Administratoren mit abgebrochenen Germanistikstudium stört.) Dieser Kernel wurde dann in das Rootverzeichnis gelegt.

Kein Quellcode, kein Compiler

Fast alle großen Hersteller von UNIX liefern heute weder die Quelltexte aus, noch ist ein Compiler im Paket enthalten. Das hat mehrere Gründe. Zum einen ist die Art der Anpassung nicht gerade besonders komfortabel. Das Übersetzen ist eine langwierige Geschichte. Das Ausliefern des Quelltextes möchte man vermeiden, um der Konkurrenz keinen Einblick in die eigenen Fortschritte zu geben und schließlich erhofft man sich durch den Verkauf des Compilers als separatem Paket ein Zusatzgeschäft.

Kernel bilden ist out.

Die meisten Parameter des Betriebssystems können heute dem Betriebssystem mitgeteilt werden, ohne eine Neukompilierung zu veranlassen. Einige Größen wie beispielsweise die Anzahl der Plattenpuffer werden nicht mehr festgelegt, sondern vom Betriebssystem dynamisch gebildet, wenn sie erforderlich sind. Treiber werden nicht mehr in den Kernel integriert, sondern als Module während des Laufs hinzugezogen. Das Bilden des Kernels wird darum auf den meisten UNIX Plattformen durch ein menügesteuertes Systemtool erreicht und hat mit dem Compilieren früherer Zeiten nicht mehr viel zu tun.

Linux wird, allerdings aus anderen Gründen, heute noch mit dem kompletten Quellcode ausgeliefert. Auch ein Compiler wird mitgeliefert, so dass das Bilden des Kernels durch mehrere Aufrufe von make abläuft. Nur wenige Parameter werden allerdings noch durch Ändern von Konstanten im Quellcode angepasst. Normalerweise sind solche Parameter durch Umgebungsvariablen einstellbar. Auch die meisten Treiber werden als Module beim Start geladen. Nur bei einigen exotischen Geräten muss man noch selbst Treiber aktivieren oder deaktivieren. Durch die Möglichkeit, Fähigkeiten des Kernels wegzulassen, kann man allerdings sehr spezialisierte, kleine Kernel bauen, die auch auf schmaler Hardware noch laufen.

Generieren eines Linuxkernels

Das Generieren des Kernels erfolgt durch Aufrufe des Programmes make mit unterschiedlichen Zielen.

make config

Mit make config wird ein Dialog gestartet, in dem man wie in einem Multiple Choice Test beantwortet, welche Bestandteile der neue Kernel haben soll. Nacheinander werden die Bestandteile angeboten. Der Administrator muss entscheiden, ob er die Fähigkeit einbinden will oder nicht, oder als Modul zur Verfügung stellen soll. Es werden schlüssige Voreinstellungen vorgeschlagen und zur Unterstützung gibt es kleine Hilfetexte zu jedem Thema.

make dep

Ein make dep erstellt die Abhängigkeiten aus dem Konfigurationslauf und bereitet vor, welche Dateien für den Kernel gebraucht werden.

make bzImage

Ein make bzImage erzeugt schließlich den Kernel und generiert auch gleich den passenden Booteintrag. Wenn man sich noch nicht so ganz sicher ist, kann man auch erst einmal eine Diskettenversion erzeugen. Der Befehl lautet dann make bzdisk. Vorher sollte eine formatierte Diskette ins Laufwerk gesteckt werden.

Basteleien am Kernel sind durchaus etwas riskant. Die mindesten Sicherheitsvorkehrungen sind eine Sicherungskopie des bisherigen, funktionierenden Kernels und ein Medium (CD oder Diskette), mit dem man das System soweit booten kann, um den gesicherten Kernel wieder an seine ursprüngliche Position zu bringen.

Dynamische Bibliotheken

Dynamische Bibliotheken sparen Platz

Bestimmte immer wiederkehrende Bibliotheken wurden früher statisch jedem UNIX-Programm hinzugebunden. Da es Speicherplatzverschwendung ist, die gleiche Bibliothek in jedem Programm wieder und wieder auf der Platte und hinterher auch im Hauptspeicher zu haben, gibt es dynamische Bibliotheken. Besonders mit der Verwendung grafischer Oberflächen ist es fast unmöglich, alle Bibliotheken statisch zu jeder Anwendung hinzuzuladen.

Im Gegensatz zu anderen Systemen ist es nicht üblich, dass Anwenderprogramme neue Versionen der von ihnen benötigten dynamischen Bibliotheken heimlich installieren. Der Update der Bibliotheken obliegt dem Administrator und das Programm kann seinen Kummer darüber zum Ausdruck bringen, dass eine bestimmte Mindestversion einer Bibliothek nicht vorliegt und gegebenfalls enden. Damit ist auf einfache Weise verhindert, dass Software nicht mehr läuft, weil ein anderes Programm installiert wurde.

Man erkennt dynamische Bibliotheken an der Namensendung .so und sie befinden sich im Normalfall im Verzeichnis /lib oder /usr/lib.

Module

Ursprünglich wurden alle Treiber in den Kernel eingebunden. Wenn es notwendig war, eine andere Konfiguration zu verwenden, wurde halt ein neuer Kernel generiert. Solaris, Linux, FreeBSD und damit MacOS X besitzen ein Modulkonzept, um Treiber separat vom Kernel installieren zu können.

Solaris arbeitet mit einem modularen Kernel

Unter Solaris erlangt man mit dem Befehl modinfo eine Übersicht über die aktuell geladenen Module. Mit add_drv kann man Treiber hinzufügen und mit rem_drv wieder entfernen. Nach dem Hinzufügen wird durch den Aufruf von drvconfig eine Neukonfiguration des Verzeichnisses /devices durchgeführt. Für Module, die keinen Zugriff auf Gerätedateien brauchen, lauten die Befehle modload und modunload.1)

FreeBSD und MacOS X

FreeBSD verwendet die Kommandos kldload und kldunload zum Einbinden und Entfernen von Modulen. kldstat gibt eine Übersicht. MacOS X erbt diese Eigenschaften von FreeBSD und nennt die Kommandos kmodload, kmodunload und kmodstat.

Linux

Linux braucht zwingend in seinem Kernel den Treiber für die Hardware und für das Dateisystem, auf dem sich das Wurzelverzeichnis befindet, damit das Booten möglich ist. Alle anderen Bestandteile können auch als Module geladen werden. Die Module befinden sich im Verzeichnis /lib/modules. Darunter befindet sich ein Verzeichnis, das die Versionsnummer des Kernels trägt. Hierunter finden ein Vereichnisbaum, in dem die Module themenspezifisch abgelegt sind.

Module anzeigen, installieren und entfernen

Die geladenen Module zeigt der Befehl lsmod an. Es zeigt den Namen des Moduls, seine Größe, die Anzahl der Zugriffe auf das Modul. Nur wenn die Zugriffe 0 sind, kann ein Modul mit dem Befehl rmmod wieder entfernt werden. Mit dem Befehl insmod kann ein Modul geladen werden. Mit weiteren Optionen kann dem Modul weitere Parameter übergeben werden, beispielsweise Interruptnummern oder I/O-Adressen. Eine Variante des insmod ist der Befehl modprob. Er versucht, ein Modul zu installieren und kann anhand der /etc/modules.conf feststellen, wie ein Modul einzubinden ist.

modules.conf

In der Datei /etc/modules.conf stehen die Informationen zu den verschiedenen Modulen. Die Datei hat verschiedene Einträge. Zunächst kann sie die Einträge in /dev auf Namen mit alias-Anweisungen umsetzen. Beispielsweise:

# block dev aliases
alias block-major-1 rd
alias block-major-2 floppy
alias block-major-3 off
alias block-major-7 loop
 ...
alias char-major-6 lp
alias char-major-9 st

Mit der Anweisung options kann einem Modul Parameter übergeben werden. Im folgenden Beispiel wird der Soundkarte cs4232 IO-Adresse, Interrupt und DMA-Kanäle mitgegeben.

options cs4232 io=0x534 irq=5 dma=1 dma2=0 mpuio=0x330 mpuirq=9

Mit den Anweisungen post-install und pre-install kann festgelegt werden, welche Treiber vorher oder nachher installiert oder deinstalliert werden müssen.


1 vgl. Nemeth, Evi / Snyder, Garth / Seebass, Scott / Hein, Trent R.: UNIX Systemverwaltung. MarktTechnik - Prentice Hall, 2001, S. 334f.

Diese Seite basiert auf Inhalten aus dem Buch Arnold Willemer: Wie werde ich UNIX-Guru
Verlagsrechte bei galileo computing


Homepage (C) Copyright 2002 Arnold Willemer