Linux ( []) ist ein Betriebssystem-Kernel, der im Jahr 1991 von Linus Torvalds ursprünglich für die 32-Bit-x86-Architektur „i386“, retronym „IA-32“, entwickelt wurde und ab Version 0.12 unter der freien GNU General Public License (GPL) veröffentlicht wird. Er ist heute Teil einer Vielzahl von Betriebssystemen.

Der Name Linux setzt sich zusammen aus dem Namen Linus und einem X für das als Vorbild dienende Unix. Er bezeichnet im weiteren Sinne mittlerweile nicht mehr nur den Kernel selbst, sondern übertragen davon ganze Linux-basierte Systeme und Distributionen. Dies führte zum GNU/Linux-Namensstreit.

Grundlegende Technologie mini|Grob-Struktur des Linux-Kernels

Aufgaben des Kernels

Der Kernel eines Betriebssystems bildet die hardwareabstrahierende Schicht, das heißt, er stellt der auf dieser Basis aufsetzenden Software eine einheitliche Schnittstelle (API) zur Verfügung, die weitgehend unabhängig von der Rechnerarchitektur ist. Die Software kann nur über die Schnittstelle auf die Hardware zugreifen, ohne deren Details genauer kennen zu müssen (Abstraktion). Linux ist dabei ein modularer monolithischer Kernel und zuständig für Speicherverwaltung, Prozessverwaltung, Multitasking, Lastverteilung, Sicherheitserzwingung und Eingabe/Ausgabe-Operationen auf verschiedenen Geräten.

Programmiersprache Linux ist fast ausschließlich in der Programmiersprache C geschrieben, wobei einige GNU-C-Erweiterungen benutzt werden. Ausnahmen bilden die architekturabhängigen Teile des Codes (im Verzeichnis arch innerhalb der Linux-Sourcen), wie zum Beispiel der Beginn des Systemstarts (Bootvorgang), der in Assemblersprache geschrieben ist, sowie die Programmiersprache Rust, die seit der Version 6.1 erstmals unterstützt und seit 6.8 erstmals für einzelne Gerätetreiber genutzt wird.

Funktionsweise Bei einem strikt monolithischen Kernel wird der gesamte Quellcode inklusive aller Treiber in das Kernel-Image (den ausführbaren Kernel) kompiliert. Im Gegensatz dazu kann Linux Module benutzen, die während des Betriebs geladen und wieder entfernt werden können. Damit wird die Flexibilität erreicht, um unterschiedlichste Hardware ansprechen zu können, ohne sämtliche (auch nicht benötigte) Treiber und andere Systemteile im Arbeitsspeicher halten zu müssen.

Sind Teile der Hardwarespezifikationen nicht genügend offengelegt, so stützt sich Linux notfalls über spezielle VM86-Modi auch auf das BIOS des Systems, u. a. auf die Erweiterungen gemäß den Standards APM, ACPI und VESA. Um unter diesen Voraussetzungen x86-kompatible Hardware z. B. auf der DEC-Alpha-Plattform zu betreiben, werden teilweise sogar Emulatoren zur Ausführung entsprechenden ROM-Codes verwendet. Linux selbst übernimmt das System beim Bootprozess typischerweise in dem Moment, in dem der Bootloader der Systemfirmware („BIOS“) erfolgreich war und daher alle Systeminitialisierungen des BIOS abgeschlossen sind.

Der Kernel ist ein Betriebssystemkern und darf nicht als das eigentliche Betriebssystem verstanden werden. Dieses setzt sich aus dem Kernel und weiteren grundlegenden Bibliotheken und Programmen (die den Computer erst bedienbar machen) zusammen.

Siehe auch: Gerätedatei, Network Block Device, Netfilter, Netzwerk-Scheduler, Prozess-Scheduler, Linux (Betriebssystem)

Schnittstellen mini|Linux Standard Base

Man kann zwischen vier Schnittstellen unterscheiden, die das Zusammenwirken von entweder kernelinternen Komponenten untereinander oder von Kernel und externer Software ermöglichen. Die Stabilität der externen Programmierschnittstelle wird garantiert, das heißt, dass Quellcode grundsätzlich ohne wesentliche Veränderungen portierbar ist. Die Stabilität der internen Programmierschnittstellen wird nicht garantiert, diese können zehn Jahre oder wenige Monate stabil bleiben. Da der Linux-Kernel von einigen tausend Entwicklern vorangetrieben wird, ist der eventuell entstehende Aufwand zu verschmerzen.

Die Binärschnittstelle des Kernels ist unerheblich, auf das komplette Betriebssystem kommt es an. Die Linux Standard Base (LSB) soll es ermöglichen, kommerzielle Programme unverändert zwischen Linux Betriebssystemen zu portieren. Die interne Binärschnittstelle ist nicht stabil, und es gibt keinerlei Bestrebungen, dies zu ändern; dies hat zur Folge, dass ein internes Modul, welches z. B. für Linux 3.0 kompiliert worden ist, höchstwahrscheinlich nicht mit Linux-Kernel 3.1 zusammenarbeiten wird. Dies ist eine ganz bewusste Entscheidung.index: kernel/git/torvalds/linux.git

Architektur

Linux ist ein monolithischer Kernel. Die Treiber im Kernel und die Kernel-Module laufen im privilegierten Modus (x86: Ring 0), haben also unbeschränkten Zugriff auf die Hardware. Einige wenige Module des Kernels laufen im eingeschränkten Benutzermodus (x86: Ring 3). Die Level 1 und 2 der x86-Architektur werden von Linux nicht genutzt, da sie auf vielen anderen Architekturen nicht existieren und der Kernel auf allen unterstützten Architekturen im Wesentlichen gleich funktionieren soll.

Nahezu jeder Treiber kann auch als Modul zur Verfügung stehen und vom System dann dynamisch nachgeladen werden. Ausgenommen davon sind Treiber, die für das Starten des Systems verantwortlich sind, bevor auf das Dateisystem zugegriffen werden kann. Man kann allerdings den Kernel so konfigurieren, dass ein CramFS- oder Initramfs-Dateisystem vor dem tatsächlichen Root-Dateisystem geladen wird, welches die weiteren für den Startprozess notwendigen Module enthält. Dadurch kann die Kernelgröße verringert und die Flexibilität drastisch erhöht werden.

Im System laufende Programme bekommen wiederum vom Kernel Prozessorzeit zugewiesen. Jeder dieser Prozesse erhält einen eigenen, geschützten Speicherbereich und kann nur über Systemaufrufe auf die Gerätetreiber und das Betriebssystem zugreifen. Die Prozesse laufen dabei im Benutzermodus (), während der Kernel im Kernel-Modus () arbeitet. Die Privilegien im Benutzermodus sind sehr eingeschränkt. Abstraktion und Speicherschutz sind nahezu vollkommen, ein direkter Zugriff wird nur sehr selten und unter genau kontrollierten Bedingungen gestattet. Dies hat den Vorteil, dass kein Programm z. B. durch einen Fehler das System zum Absturz bringen kann.

Linux stellt wie sein Vorbild Unix eine vollständige Abstraktion und Virtualisierung für nahezu alle Betriebsmittel bereit (z. B. virtueller Speicher, Illusion eines eigenen Prozessors usw.).

Die Tatsache, dass Linux nicht auf einem Microkernel basiert, war Thema eines berühmten Flame Wars zwischen Linus Torvalds und Andrew S. Tanenbaum. Anfang der 1990er Jahre, als Linux entwickelt wurde, galten monolithische Kernels als obsolet (Linux war zu diesem Zeitpunkt noch rein monolithisch). Die Diskussion und Zusammenfassungen sind im Artikel Geschichte von Linux näher beschrieben.

Durch Erweiterungen wie FUSE und durch die zunehmende Verwendung von Kernel-Prozessen fließen mittlerweile auch zahlreiche Microkernel-Konzepte in Linux ein.

Portierbarkeit Obwohl Linus Torvalds eigentlich nicht beabsichtigt hatte, einen portierbaren Kernel zu schreiben, hat sich Linux dank des GNU-Compilers GCC weitreichend in diese Richtung entwickelt. Es ist inzwischen das häufigste portierte System – das Repertoire reicht dabei von eher selten anzutreffenden Betriebsumgebungen wie dem iPAQ-Handheld-Computer, Digitalkameras, Anlagesteuerungen, Großrechner wie IBMs System z über Supercomputer bis hin zu normalen PCs. Ebenfalls weit verbreitet ist der Kernel unter Webservern und dank Android auch auf Mobiltelefonen.

Die Portierung von Linux auf IBMs S/390-Architektur im Jahr 1999 war ursprünglich vom IBM-Management nicht beauftragt (Skunk works), stellte jedoch einen wesentlichen Schritt des Konzerns auf dem Weg zur Akzeptanz von Linux als Standard-Server-Plattform dar. Die im darauffolgenden Jahr angekündigte Investition von 1 Mrd. USD in das Linux Ökosystem und die „Peace, Love, Linux“-Kampagne aus dem Jahr 2001 waren weitere Schritte. Später plante IBM bspw. auch die IBM-Supercomputergeneration Blue Gene mit einem eigenen Linux-Port auszustatten.

Ursprünglich hatte Torvalds eine ganz andere Art von Portierbarkeit für sein System angestrebt, nämlich die Möglichkeit, freie GPL- und andere quelloffene Software leicht unter Linux kompilieren zu können. Dieses Ziel wurde bereits sehr früh erreicht und macht sicherlich einen guten Teil des Erfolges von Linux aus, da es jedem eine einfache Möglichkeit bietet, auf einem freien System freie Software laufen zu lassen.

Die ersten Architekturen, auf denen Linux lief, waren die von Linus Torvalds verwendeten Computer: IA-32 (x86 ab dem i386) – Linus hatte ab 1991 einen PC mit Intel-386DX-33-MHz-Prozessor, 4 MB RAM und einer 40-MB-Festplatte. Alpha – Torvalds arbeitete von 1994 bis 1995 an der Portierung auf die 64-Bit-Alpha-Architektur (auf einem DEC-Alpha-Rechner, den er als Leihgabe erhalten hatte).

Damit war Linux sehr früh 64-Bit-fähig (Linux 1.2 erschien 1995) und durch die Portierung auf Alpha war der Weg für weitere Portierungen frei. Zeitgleich arbeitete der Student Dave Miller ab 1993 an der Portierung auf SPARC von Sun Microsystems, einer damals weit verbreiteten Architektur. Doch lief Linux 2.0 von Mitte 1996 offiziell auf IA-32 und Alpha, konnte aber bereits SMP.

Mit Linux 2.2 vom Januar 1999 kamen folgende Ports hinzu: SPARC/​UltraSPARC von Oracle (ursprünglich von Sun) 68000 (m68k) von Motorola PowerPC (ppc) von Apple, IBM und Motorola (AIM-Allianz)

Mit Linux 2.4 vom Januar 2001 kamen schließlich folgende Architekturen hinzu: Itanium (IA-64) von Intel und HP (mit Kernel 5.11 als „verwaist“ markiert und ab Version 6.7 von 2024 aus dem offiziellen Kernel entfernt) S/390 von IBM SuperH von Hitachi MIPS

Trotz der unterstützten Befehlssatzarchitekturen (, kurz ISA) ist für die Lauffähigkeit mehr nötig, sodass Linux gegenwärtig auf u. a. folgenden Plattformen und Architekturen läuft: Acorn Archimedes, A5000 und Risc-PC-Serie (Arm, StrongARM, Intel XScale usw.) Alpha von Compaq Axis Communications’ CRIS Blackfin Hitachi H8/​300 Hewlett-Packard PA-RISC IBM S/390 und z Systems MIPS: Maschinen von Silicon Graphics … Motorola 68020 und neuer: spätere Amigas, einige Atari und viele Apple Computer ab 1987 (Macintosh II) bis 1995 (siehe Linux68k) NEC v850e PowerPC: die meisten Apple Computer zwischen 1994 und 2006 (alle PCI-basierten Power Macintosh, der Nintendo GameCube; begrenzte Unterstützung für NuBus Power Macs bis Kernel 2.4.x, die weitere Entwicklung wurde in das Projekt PPC/Linux for NuBus Power Macs ausgelagert), Clones der Power Macs von Power Computing, UMAX und Motorola, mit einer „Power-UP“-Karte verbesserte Amigas (z. B. Blizzard oder CyberStorm) bzw. dessen Nachfolger AmigaOne, sowohl IBM Power als auch PowerPC-basierte IBM RS/6000-Systeme, verschiedene eingebettete PowerPC-Plattformen Sun/​Oracle SPARC und UltraSparc: Workstations von Sun- bzw. Oracle SuperH von Hitachi: Sega Dreamcast OpenRISC RISC-V x86-Architektur: x86-16-Bit: im Rahmen des ELKS-Projektes werden IBM-PC-kompatible Computer mit den 16-Bit-Prozessoren 8086, 8088, 80186, 80188, 80286 und dazu kompatiblen unterstützt. Die Abkürzung „ELKS“ steht für und stellt eine Untermenge des Linux-2.0/2.1-Kernels dar. Das angestrebte Ziel ist Kompatibilität zu Unix-V7 auf 16-Bit-x86-Systemen. IA-32, 32-Bit: IBM PCs und kompatible mit Intel 80386 (bis Kernel 3.7, Anfang 2013) bzw. Intel 80486 und dazu kompatiblen x86-Prozessor-Architekturen nachfolgender Generationen x86-64, 64-Bit: Unter der Bezeichnung „amd64“ oder x64 werden Prozessoren der x86-Architektur verstanden, die einen 64-Bit-Modus bieten (implementiert als AMD64 oder Intel 64). Dabei handelt es sich um die Nachfolger der ursprünglichen IBM-PC-kompatiblen Computer, die einen zum AMD Opteron kompatiblen x86-Prozessor nutzen, beispielsweise: von AMD ab Athlon 64, Turion, Phenom und von Intel ab Core 2, Xeon.

Binärschnittstellen der Arm-Architektur