Was ist ein Betriebssystemkern?
Ein Computer besteht aus Hardware: Prozessoren, Arbeitsspeicher, Datenträgern, Netzwerkkarten und vielem mehr. Auf dieser Hardware sollen viele Programme gleichzeitig, sicher voneinander getrennt und ohne Kenntnis der konkreten Hardware laufen. Diese Aufgabe übernimmt der Kernel: der Teil des Betriebssystems, der im privilegierten KernelmodusKernelmodusPrivilegierter Betriebsmodus der CPU, in dem alle Befehle und der gesamte Speicher zugänglich sind. Auf x86 Ring 0. der CPU läuft und als einziger uneingeschränkten Zugriff auf die Hardware hat.
Seine Aufgaben lassen sich in drei Gruppen einteilen:
- Abstraktion. Der Kernel bietet einfache, einheitliche Konzepte anstelle der Hardwaredetails. Programme arbeiten mit Dateien statt mit Sektoren auf einer SSD, mit Sockets statt mit Registern einer Netzwerkkarte und mit Prozessen statt mit einem nackten Prozessor.
- Ressourcenverwaltung. CPU-Zeit, Arbeitsspeicher, Datenträger und Netzwerkbandbreite sind begrenzt. Der Kernel teilt sie auf: zeitlich, indem der Scheduler die CPU reihum an Prozesse vergibt, und räumlich, indem jeder Prozess eigene Bereiche im Arbeitsspeicher bekommt.
- Schutz und Isolation. Ein fehlerhaftes oder bösartiges Programm darf weder andere Programme noch den Kernel selbst beschädigen. Dafür nutzt der Kernel Hardwarefunktionen wie Privilegstufen und die MMUMMU (Memory Management Unit)Hardware-Baustein der CPU, der virtuelle in physische Adressen übersetzt und dabei Zugriffsrechte prüft..
Das Schichtenmodell zeigt eine strikte Regel: Anwendungen greifen nie direkt auf Hardware zu. Wenn ein Programm eine Datei lesen, Speicher anfordern oder ein Netzwerkpaket senden will, ruft es eine Funktion der C-Bibliothek auf. Diese führt einen SystemaufrufSystemaufruf (System Call)Kontrollierter Einsprung aus einem Anwendungsprogramm in den Kernel, um eine privilegierte Dienstleistung anzufordern, z. B. eine Datei zu lesen. aus und übergibt damit die Kontrolle an den Kernel. Wie das im Detail funktioniert, zeigt Kapitel 4.
Linux ist (nur) der Kernel
Im Alltag bezeichnet „Linux“ meist ein komplettes Betriebssystem wie Ubuntu, Fedora oder Arch Linux. Genau genommen ist Linux nur der Kernel. Eine Distribution kombiniert ihn mit vielen weiteren Komponenten:
- einer C-Bibliothek (meist die GNU C Library glibc, bei Alpine Linux musl),
- einem Init-System, das als erster Prozess startet (meist systemd),
- Basiswerkzeugen wie Shell,
lsodercp(GNU coreutils oder BusyBox), - einem Paketmanager, einer grafischen Oberfläche und Anwendungen.
Weil viele dieser Werkzeuge aus dem GNU-Projekt stammen, spricht man auch von „GNU/Linux“. Dass der Kernel tatsächlich unabhängig ist, zeigt Android: Es verwendet den Linux-Kernel, aber eine eigene C-Bibliothek (Bionic) und eine völlig andere Systemumgebung.
Bauarten von Kerneln
Wie viel Funktionalität im privilegierten Kernelmodus laufen soll, ist eine der grundlegenden Designentscheidungen eines Betriebssystems. Dabei haben sich zwei Extreme herausgebildet:
Monolithischer Kernel. Alle zentralen Dienste laufen als ein einziges Programm im Kernelmodus und in einem gemeinsamen Adressraum: Scheduler, Speicherverwaltung, Dateisysteme, Netzwerk-Stack und Gerätetreiber. Die Komponenten rufen sich gegenseitig über gewöhnliche Funktionsaufrufe auf. Das ist schnell, hat aber eine Kehrseite: Ein Fehler in einem beliebigen Treiber kann das gesamte System zum Absturz bringen.
Mikrokernel. Der Kernel enthält nur das absolut Notwendige, typischerweise Adressräume, Threads/Scheduling und Interprozesskommunikation (IPC). Dateisysteme, Treiber und Netzwerk laufen als Server-Prozesse im Benutzermodus. Stürzt ein Treiber ab, kann er neu gestartet werden. Dafür kostet jede Interaktion Nachrichten und Kontextwechsel.
Hybridkernel. Systeme wie Windows NT oder Apples XNU folgen in ihrer Struktur Mikrokernel-Ideen, führen aus Leistungsgründen aber viele Dienste doch im Kernelmodus aus.
| Kriterium | Monolithisch | Mikrokernel |
|---|---|---|
| Kommunikation zwischen Komponenten | Funktionsaufruf | IPC-Nachricht, Kontextwechsel |
| Leistung | sehr hoch | geringer (IPC-Overhead), bei modernen Mikrokerneln aber stark optimiert |
| Robustheit | Treiberfehler kann das ganze System treffen | Fehler bleiben meist auf einen Server begrenzt |
| Code im privilegierten Modus | groß (Millionen Zeilen) | klein (seL4: rund 10.000 Zeilen, formal verifiziert) |
| Beispiele | Linux, FreeBSD, OpenBSD | seL4, QNX, MINIX 3 |
Linux: monolithisch, aber modular
Linux ist ein klassischer monolithischer Kernel, aber kein starrer. Große Teile, vor allem Treiber und Dateisysteme, lassen sich als Kernel-ModuleKernel-ModulZur Laufzeit ladbarer Teil des Kernels (Datei mit Endung .ko), meist ein Gerätetreiber oder Dateisystem. zur Laufzeit laden und entladen. Ein Modul läuft nach dem Laden allerdings mit denselben Rechten wie der restliche Kernel. Modularität bedeutet hier also Flexibilität, nicht Isolation.
Darüber hinaus bietet Linux einige Mechanismen, um Funktionalität gezielt aus dem Kernel herauszuhalten:
- FUSE erlaubt Dateisysteme als normale Programme im User Space (z. B.
sshfs). - VFIO/UIO ermöglichen Gerätetreiber im User Space, etwa für Hochleistungs-Netzwerkanwendungen.
- eBPF lässt kleine, vom Kernel geprüfte Programme sicher im Kernel ausführen (siehe Kapitel 16).
Tiefer eintauchenDie Tanenbaum-Torvalds-Debatte (1992)
Im Januar 1992 veröffentlichte Andrew S. Tanenbaum, Autor des Lehrbetriebssystems MINIX und bekannter Lehrbücher, in der Newsgroup comp.os.minix einen Beitrag mit dem Titel „LINUX is obsolete“. Seine Hauptargumente: Monolithische Kernel seien ein Rückschritt in die 1970er-Jahre, die Zukunft gehöre den Mikrokerneln. Außerdem sei Linux zu eng an die x86-Architektur gebunden.
Linus Torvalds, damals Student in Helsinki, hielt dagegen: Ein monolithischer Kernel sei einfacher zu entwickeln und schneller, und die theoretischen Vorteile von Mikrokerneln zeigten sich in der Praxis (noch) nicht.
Rückblickend hatten beide in Teilen recht. Linux wurde auf rund 20 Architekturen portiert und ist heute der verbreitetste Kernel der Welt. Gleichzeitig laufen Mikrokernel wie QNX oder seL4 dort, wo Ausfallsicherheit und Verifizierbarkeit entscheidend sind, etwa in Fahrzeugen, Medizintechnik und Luftfahrt.
Eine kurze Geschichte von Linux
| Jahr | Ereignis |
|---|---|
| 1991 | Am 25. August kündigt Linus Torvalds in comp.os.minix sein Hobby-Betriebssystem an („just a hobby, won’t be big and professional like gnu“). Im September erscheint Version 0.01. |
| 1992 | Mit Version 0.12 steht Linux unter der GNU GPLv2GPLv2GNU General Public License, Version 2 – die Lizenz des Linux-Kernels. Veränderte Versionen müssen bei Weitergabe ebenfalls im Quellcode verfügbar gemacht werden., die bis heute gilt. |
| 1994 | Version 1.0 erscheint. |
| 1996 | Version 2.0 unterstützt erstmals Mehrprozessorsysteme (SMP). |
| 2003 | Version 2.6 bringt u. a. einen neuen Scheduler und ein überarbeitetes Gerätemodell. |
| 2005 | Für die Kernel-Entwicklung entsteht das Versionsverwaltungssystem Git. |
| 2011 | Version 3.0; seitdem tragen Versionsnummern keine besondere Bedeutung mehr. |
| 2022 | Mit Version 6.1 wird Rust als zweite Sprache für Kernel-Code aufgenommen. |
| 2026 | Version 7.0 erscheint. |
Heute läuft Linux auf fast allen Servern und Supercomputern, in Android-Smartphones, Routern, Fernsehern, Autos und Raumfahrzeugen. An jeder neuen Version arbeiten rund 2.000 Personen mit, die zusammen etwa 12.000 bis 15.000 Änderungen beitragen.
Versionen und Entwicklungsmodell
Eine Kernel-Version besteht aus zwei Zahlen, etwa 6.18; Fehlerkorrekturen hängen eine dritte an (6.18.5). Die erste Zahl wird erhöht, wenn die zweite Linus Torvalds zu groß erscheint, technisch bedeutet der Sprung von 6.19 auf 7.0 nichts Besonderes.
Der Entwicklungszyklus folgt einem festen Rhythmus von etwa 9 bis 10 Wochen:
- Merge Window (2 Wochen): Nach einer Veröffentlichung übernimmt Linus die neuen Funktionen, die die Subsystem-Maintainer vorbereitet haben.
- Release Candidates: Danach erscheint wöchentlich ein Testkandidat (
-rc1,-rc2…), meist bis-rc7oder-rc8. In dieser Phase werden nur noch Fehler behoben. - Release: Die neue Version erscheint, und das nächste Merge Window beginnt.
Neben der Hauptentwicklungslinie („mainline“) gibt es Stable-Kernel, die nur Fehlerkorrekturen erhalten, und LTS-KernelLTS (Longterm Support)Kernel-Version, die über mehrere Jahre mit Fehlerkorrekturen und Sicherheitsupdates versorgt wird – in der Regel die letzte Version eines Kalenderjahres. (Longterm), die über mehrere Jahre gepflegt werden. Als LTS wird in der Regel die letzte Version eines Jahres gewählt. Distributionen bauen meist auf einem LTS-Kernel auf und ergänzen eigene Patches.
Selbst ausprobieren
Selbst ausprobieren: Welcher Kernel läuft bei dir?
# Version des laufenden Kernels
uname -r
# Ausführlicher: Version, Compiler und Build-Datum
cat /proc/version
# Mit welchen Parametern wurde der Kernel gestartet? (mehr in Kapitel 3)
cat /proc/cmdline
# Welche Module sind gerade geladen? (Name, Größe, Nutzungszähler)
lsmod | head -n 15/proc ist kein Verzeichnis auf der Festplatte, sondern ein virtuelles Dateisystem: Jeder Lesezugriff wird vom Kernel live beantwortet. Mehr dazu in Kapitel 10.