Bild: Sajad Nori/Unsplash

(Betriebssystem-) Kernel

Was ist ein Kernel?

Der Kernel ist ein Teil des Betriebssystems eines Computers. Er bildet die Basis für jede weitere Software, die darauf laufen wird. Wenn du dir ein Betriebssystem als Pyramide vorstellst, bildet der Kernel den untersten Teil, das Fundament.

In modernen Systemen ist der Kernel die einzige Komponente, die direkten Zugriff auf die Hardware des Computers hat. Andere Software, die darauf zugreifen möchte, muss einen kleinen Umweg über die Schnittstellen gehen, die der Kern bereitstellt. Diese Herangehensweise hat sich im Interesse der Stabilität und Sicherheit des Gesamtsystems etabliert, sodass nahezu alle modernen Systeme so aufgebaut sind.

Die Komponente hat verschiedene Aufgaben. Neben der direkten Kommunikation mit der Hardware, verwaltet sie den Speicher, die laufenden Prozesse (Programme), die angeschlossenen oder virtuellen Geräte und Dateisysteme auf Speichermedien. Wie genau das funktioniert, ist in verschiedenen Konzepten unterschiedlich gelöst.

Werden alle diese Aufgaben im Kernel selbst erledigt, spricht man von einem monolithischen Kernel, beispielsweise Linux. Werden die Aufgaben in Teilprozesse aufgeteilt, handelt es sich um einen Mikrokernel, beispielsweise GNU Hurd oder Mach, der teilweise noch heute die Grundlage von macOS (seit Mac OS X) und allen anderen Apple-Betriebssystemen wie iOS oder iPadOS bildet. Daneben existieren Modelle, in denen bestimmte Aufgaben integriert und andere in Prozesse ausgelagert werden, in dem Fall ist es ein Hybridkernel. Das wohl prominenteste Beispiel hierfür ist Windows NT – die Grundlage für alle modernen Windows-Systeme.

Schnittstelle nach außen

Dass Programme, die bestimmte Anfragen haben, den Weg über den Kernel gehen müssen, hat übrigens ganz praktische Vorteile. Für den Programmierer einer Anwendung sieht jedes System gleich aus. Schreibst du etwa ein Programm für Linux, kannst du dich darauf verlassen, dass die Schnittstellen, die du verwenden möchtest (oder musst), auf jedem System gleich aussehen. Du musst dir dabei keine Gedanken machen, welche Hardware zum Einsatz kommt. In vielen Fällen ist es sogar unerheblich, auf welcher Plattform dein Programm laufen wird. Oft genügt ein einfaches Kompilieren für die Zielplattform und das Programm funktioniert ohne Änderungen am Quellcode.

Der Kernel behält die Kontrolle

Die wichtigste Aufgabe des Kernels ist, die Kontrolle über alle für das System relevanten Dinge zu haben. Als Beispiel seien Speicher und Prozesse sowie Ressourcen genannt.

Wenn eine Anwendung Arbeitsspeicher benötigt, ist es Aufgabe des Kernels, einen geeigneten Speicherbereich zu finden und der Anwendung zuzuordnen. Das Programm darf in der Folge nur seinen eigenen Speicher lesen (und schreiben). Versucht es, auf fremden Speicher zuzugreifen, muss der Kernel einschreiten und wirft einen Zugriffsfehler.

Ähnlich verhält es sich mit Prozessen und Ressourcen. Ein Prozess – also im einfachsten Fall ein Programm – möchte Ressourcen des Computers nutzen, etwa den Prozessor. Der Kernel muss dafür sorgen, dass es einem Prozess nicht möglich ist, den Prozessor „unendlich lange“ zu blockieren, denn andere Anwendungen möchten ebenfalls etwas berechnen. Der sogenannte Scheduler, der meistens in den Kernel integriert ist, teilt den Prozessen gewisse Kontingente zu, während derer sie die verfügbaren Ressourcen nutzen dürfen. Darüber kann sich ein Prozess nicht hinwegsetzen, denn das System zieht nach Ablauf der Zeit gewissermaßen den Stecker und erlaubt dem nächsten in der Warteschlange das Nutzen von Prozessor und Co.

Das ist, stark vereinfacht ausgedrückt, präemptives Multitasking. Im Gegensatz dazu haben historische Betriebssysteme kooperatives Multitasking implementiert. Das ist viel einfacher zu bewerkstelligen und vertraut auf der Annahme, dass Programme keine Fehler haben und fair genug spielen, das Zepter weiterzugeben, sobald ihre aktuelle Aufgabe abgeschlossen ist. Du kannst dir sicher vorstellen, dass dies in der Praxis häufig nicht funktioniert hat.

Bootvorgang eines Computers

Es ist interessant zu wissen, dass der Kernel zwar den untersten Teil eines Betriebssystems ausmacht, den Computer aber nicht startet. In beinahe allen Fällen erledigt den Job ein Bootloader, der spezifisch für das System ist. Seine Aufgabe ist es, dort verfügbar zu sein, wo die Firmware des Computers ein Betriebssystem erwartet und anschließend den Kernel aufzurufen. Dieser übernimmt dann alle weiteren Aufgaben.