Der Kernel - Geschichte |
Übersicht |
Am 17. September 1991 postete Linus Torvalds die Ergebnisse seiner Studien zu einem Unix-ähnlichen Betriebssystem in die Newsgruppe »Minix«. Sicherlich hatte er etwas Aufmerksamkeit erhofft, aber ob er mit einer solchen Resonanz gerechnet hatte?
Diese Version 0.01 implementierte gerade mal einen rudimentären Kern, wurde aber von zahlreichen Minix-Anhängern binnen kurzer Zeit soweit ergänzt, dass er bald seinem unmittelbaren Vorgänger, dem Minix-System, den Rang ablief.
Linux kam genau zur richtigen Zeit. Schon seit mehreren Jahren arbeitete man bei der Free Software Foundation an einem freien Betriebssystem. Diese von Richard Stallman initiierte Vereinigung hatte es sich zum Ziel gesetzt, kostenlose und im Quelltext erhältliche Software für jederman zu erstellen. Die Anzahl verfügbarer Programme wuchs stetig, jedoch ließ man sich mit dem Kern der Sache, einem an Unix angelehnten Betriebssystem, ungewöhnlich viel Zeit. Man legte das Augenmerk auf ein ausgereiftes Konzept, testete verschiedene Ansätze, aber die Implementierung kam einfach nicht auf Touren.
Just in dieser Phase betrat Linux das Feld. Es erfüllte genau die Anforderung der FSF, es war frei, kostenlos und die existierende Software der FSF, allgemein bekannt als GNU-Software, lief ohne wesentliche Änderungen auf dem neuen System. Viele FSF-Anhänger sahen in der Verwendung von Linux den Stein der Weisen.
Fazit der ganzen Geschehnisse war, dass mit Linux bald ein ausgereiftes Unix für den PC, also den Privatbereich, zur Verfügung stand, ebenso wie eine Fülle von Anwendungen, die zumindest aus funktioneller Sicht sich nicht hinter dem Standard kommerzieller Produkte zu verstecken brauchten.
Und das ureigene Betriebssystem des FSF? Dies liegt unterdessen vor. HURD verkörpert den Stand der Forschung, es besitzt eine saubere Struktur, einen Mikrokernel und arbeitet sehr schnell. Aus Sicht des Theoretikers sollte es sowohl Windows als auch Linux in den Schatten stellen. Aber HURD hat ein Problem, es kam einfach ein paar Jahre zu spät...
Aber wir möchten den Werdegang von Linux Revue passieren lassen. Beginnend mit dem »Ur-Kernel«, der Version 0.01 streifen wir durch die wichtigsten Stationen und blicken auch voraus, was die Entwickler für die Zukunft für Pläne mit Linux hegen...
Methodik der Versionsnummern |
Was hat es mit den Nummern auf sich? Warum gab es die Kernel 1.3 und 2.0, nicht jedoch die Versionen 1.4-1.9? Wer bestimmt, welche Nummer ein Kernel erhält?
Die Nummerierung von Softwareversionen im Linuxumfeld unterscheidet sich häufig etwas von den sonstigen Gewohnheiten. Das liegt in erster Linie daran, dass man schon während der Entwicklungsphase an einem breiten Publikum interessiert ist, das die Software auf Herz und Nieren überprüft. Üblich ist, dass ein produktionsreifes Paket mit der Version 1 herausgegeben wird. Bei freier Software heißt das allerdings nicht, dass Versionen < 1 nicht schon eingesetzt werden können. Oftmals laufen diese schon vollkommen stabil. Dass sie dennoch in ihrer Version den Entwicklerstatus kennzeichnen, liegt zum einen an den noch nicht hinreichenden Tests oder daran, dass noch nicht alle Funktionen enthalten sind, die die Entwickler vorgesehen haben. Und eine »stabile Version« schließt nicht aus, dass das Programm doch einmal den ungewollten Abgang nimmt (wer legt schon seine Hand für sein Produkt ins Feuer?).
Der Linuxkernel folgte bis zur Version 1 ebenso diesem Schema. Stabil waren die meisten der 0.x-Versionen, aber keinesfalls ausgereift genug, um ein einsatzbereites Betriebssystem zu formen. Die erste offiziell stabile Version mit den von anderen Unixen bekannten Eigenschaften war deshalb die Verion 1.0.
Während an den ersten Versionen nur ein kleiner Kreis Entwickler strickte, vermehrte sich die Zahl der Aktivisten stetig. Man suchte nun nach einem Schema, mit dem man einen Entwicklerkernel von einem stabilen Kernel unterscheiden konnte (»Entwicklerkernel« sagt nichts über die tatsächliche Robustheit dessen aus, sondern kennzeichnet diesen nur als »mit Vorsicht zu genießen«).
Schließlich setzte sich für den Kernel eine Versionsbezeichnung bestehend aus drei Nummern durch.
Kernel x.y.z
Kernel x.y.z
Kernel x.y.z
Und die Vergabe der Nummern?
Diese obliegt den »Verwaltern«, einem engeren Team von Entwicklern rund um Linus Torvald und Alan Cox. Die Diskussion über Kernelneuerungen läuft im Wesentlichen über Mailinglisten ab. Dort werden Vorschläge eingebracht und diskutiert. Absolute Neuerungen wie neueste Treiber liegen zunächst als »inoffizielle« Patches vor. Erlangt eine solche Erweiterung »Produktionsreife«, so wird sie gemeinsam mit anderen als »sinnvoll« erachtete Neuerung zunächst in einen Entwicklerkernel aufgenommen, dessen Versionsnummern (dritte Nummer) fortlaufend hochgezählt werden.
Irgendwann wird es Zeit für einen neue stabile Version. Der derzeitige Entwicklungsstand wird »eingefroren« und in Form von »Prereleases« frei gegeben. Nach einer gewissen Testphase ist es schließlich Zeit, die neue stabile Version zu veröffentlichen. Welche Nummer dieser verpasst wird, hängt letztlich vom Umfang der Neuerungen ab und dies liegt im Ermessen der Projektleiter der Kernelentwicklung.
Der Anfang Version 0.01 |
Die erste Version von Linux, die Linus Torvalds am 17. September 1991 in die Newsgruppe comp.os.minix postete, enthielt gerade einmal die notwendigsten Funktionen eines Betriebssystems.
Als einzige Plattform lief der Code auf der i386er Architektur; an Hardware wurden einzig IDE-Festplatten, Bildschirm, Tastatur und die serielle Schnittstellen unterstützt.
Als Dateisystem verwendete Linux Version 0.01 Minix in einer multithraeded-Variante, die internen Strukturen waren ansonsten mehr auf Funktionalität als auf Effizienz ausgelegt. So realisierten nur simple Methoden den für Multiprocessing notwendigen Taskwechsel; eine Prioritätensteuerung und Nachrichtenverwaltung fehlte vollkommen. Die frühe Realisierung einer Speicherverwaltung kannte immerhin schon die Verwendung von virtuellem Speicher durch Paging und Segmentierung.
Das gesamte Kernelpaket hatte eine komprimierte Größe von ca. 70 kByte.
Die 0.x Versionen |
Die nächsten Versionen 0.10 und 0.11 erschienen binnen weniger Tage noch im Dezember 1991 und im Januar 1992 wurde schließlich mit der Version 0.12 der erste »stabile« Kernel veröffentlicht. Die Änderungen der ersten Versionen waren marginal, rein funktionell waren die Unterstützung von Ramdisk, Floppy (0.10) und Swap (0.12) noch die herausragenden Erweiterungen. In diesen ersten Versionen trimmte man den Kernel zur Zusammenarbeit mit einigen wichtigen GNU-Programmen, so liefen bereits der Compiler »gcc«, die Bourne Again Shell und der Emacs unter Linux Version 0.12.
Der Versionssprung auf 0.95 im März 1992 lässt vermuten, dass man an der schnellen Veröffentlichung einer »fertigen Version« interessiert war. Vielleicht erhoffte man auch hierdurch weitere Entwickler für das Projekt zu begeistern. Zumindest stärkt die folgende Versionsflut eine solche Annahme.
Mit Version 0.96 spendierte man Linux ein eigenes, im Vergleich zu Minix wesentlich effizienteres Dateisystem - das ext. Auch kamen die Unterstützung von SCSI, Parallelport, Unix Sockets und dem MSDOS-Dateisystem hinzu.
Alle Kernel der 0.97er Reihe waren als instabil gekennzeichnet. Damalige Neuerungen waren das proc-Filesystem und die Unterstützung der Maus.
Die rasantesten Veränderungen erfuhren offensichtlich die Kernel 0.99.x. Die Versionen 0.99.13 und 0.99.14 wurden sogar in 0.99.13a, 0.99.13b bis 0.99.14z untergliedert, auch die anderen "Zwischenversionen" zierten nicht wenige Buchstaben.
Welche Eigenschaft tatsächlich mit welcher Revision Einzug in den Kernel fand, ist teils unmöglich nachzuvollziehen. Innerhalb der 0.99er Serie enstanden u.a. folgende Erweiterungen:
Die 1.x Versionen |
1994 hatten die in den 0.99er Kernel eingezogenen Neuerungen einen ausgereiften Stand erreicht und wurden in den im März 1994 erschienenen Kernel Version 1.0 aufgenommen.
Die folgenden Versionen glänzten weniger mit funktionalen Erweiterungen sondern mehr durch interne Umstrukturierungen. Zahlreiche Mechanismen wurden überarbeitet und teils durch effektivere Algorithmen ersetzt. In den Entwicklerversionen konzentrierte man sich auf die Unterstützung des PCI-Busses. In den 1.1er Versionen tauchten die ersten Realisierungen von Modulen auf.
Mit Kernelversion 1.2 wurde im März 1995 Linux auch auf den Architekturen Alpha und Sparc lauffähig. Die PCI-Erweiterungen erreichten die Marktreife und die ersten Treiber konnten als Module realisiert werden, die allerdings noch per Hand zu laden und zu entladen waren.
In der 1.3er Serie schuf man die Grundlagen für den »Quantensprung« auf Kernel 2.
Version 2.0 |
Im Juni 1996 deutete die Veröffentlichung der Version 2.0 an, dass sich am Design des Kernels eine Menge getan hatte. Der wesentliche Unterschied, der zu Inkompatibilitäten zu den Vorgängerversionen führte, lag in der Multiprozessor-Unterstützung, die die internen Abläufe und Strukturen bisheriger Kernel über den Haufen geworfen hatte.
Das allein rechtfertigt vielleicht noch keine Erhöhung der Hauptnummer, aber die weiteren Neuerungen waren nicht von minderer Qualität.
So war der neue Kernel auf den Plattformen alpha, i386, mips, ppc, sparc, M68K (Amiga) und Atari lauffähig. Die Module erlebten durch den »kerneld« (Kernel Deamon) eine Aufwertung, da sie nun dynamisch vom Kernel lad- und entladbar waren.
Zum bisherigen Umfang unterstützter Dateisysteme kamen u.a. vfat (Windows95/98), umsdos (Linux auf einem Windows-Laufwerk installieren), Netware Core Protocol (Novell) und SMB (Samba) hinzu. Quotas erlaubten nun das Beschränken von Plattenplatz für einzelne Benutzer.
Neben Überarbeitung der TCP/IP-Implementierung wurden Firewalls, IP-Tunneling, -Masquerading und Multicast-Routing nun direkt vom Kernel unterstützt und verbesserten die Netzwerkfähigkeiten von Linux enorm. Für den Privatanwender war die ISDN-Anbindung ein wesentlicher Aspekt.
Starke Erweiterung erfuhr die Hardwareunterstützung; auch tauchten das Advanced Power Management (APM) und - in späteren Patchversionen - RAID0 im Kernel auf.
Ach ja - fast hätte ich es vergessen - Tux wurde zum offiziellen Linux-Maskottchen erklärt (»Da Pinguine nicht fliegen können, können sie auch nicht abstürzen.«).
Version 2.2 |
Im Januar 1999 erschien das 11 MByte große Paket des Kernels 2.2.
Konnten bisherige Kernelversionen noch im ursprünglichen Format "a.out" erzeugt werden, müssen die neueren Versionen zwingend im Format Executable Linkage Format (ELF) vorliegen. Zwar können ältere "a.out"-Programme weiterhin verwendet werden, aber die Umstellung auf "glibc2" (neue Version der C-Bibliothek) deutet auf das Aussterben des alten Binaryformats schon hin.
Wesentlich verbessert wurde die Speicherverwaltung, so dass Linux stärker von einem großen Hauptspeicherausbau profitiert. Multiprozessorsysteme skalieren bei bis zu 12 Prozessoren gut, insgesamt werden 64 Prozessoren unterstützt.
Die Behandlung der Module wurde dem "kerneld" entzogen und in einem Kernelthread, den "kmod" realisiert. Hierdurch erreichte man eine beschleunigte Integration eines Moduls in den laufenden Kernel. Gleichsam wurde ein kernelbasierter NFS-Dämon geschaffen, der allerdings an Stabilität nicht dem bisherigen User-Space-NFS-Dämon das Wasser reichen konnte.
Den bisherigen Firewall-Mechanismus "ipfwadm" ersetzte man durch "ipchain"; eine Schnittstelle im proc-Dateisystem erlaubt seitdem das (De)Aktivieren einiger Netzwerkdienste (IP-Forwarding, IPv6...). Eine Überarbeitung erfuhr auch das TCP-Protokoll, das nun "Large Windows" beherrscht. TCP über Satellitenverbindungen ist nun möglich.
Linux spricht nun die Sprachen des Dateisystems CODA und vermag die von Acorn, Apple Mac und WindowsNT zu lesen.
Version 2.4 |
Nicht grundlos verzögerte sich die Veröffentlichung des neuen Kernels 2.4 mehrfach. Die Umstellung des 32-Bit Dateisystems auf 64 Bit brachte gehörige Probleme mit sich, da zahlreiche Algorithmen einer Neufassung bedurften. Nicht minder weite Kreise zog die Unterstützung von bis zu 64 GByte Hauptspeicher.
Die Liste unterstützter Hardware wurde vor allem mit USB-Geräten weiter angereichert. ISA-Plug&Play-Karten werden nun innerhalb des Kernels behandelt.
Auf Netzwerkebene hat sich für das mit Version 2.2 eingeführte ipchain-Firewall schon wieder eine neue Vorgehensweise eingeschlichen. Dieses Network Packet Filtering erweitert die bisherigen Methoden, stellt allerdings auch die Kompatibilität zu seinen Vorgängern sicher. Intern ist eine Eigenschaft in den Kernel eingeflossen, die es erlaubt, bei einem auf der Netzwerkkarte eintreffenden Paket, einzig den Prozess zu wecken, der den entsprechenden Socket geöffnet hält. Bislang mussten alle Prozesse, die an einem Socket lauschten, aus dem Schlaf gerissen werden, da nur sie entscheiden konnten, an wessen Tür der Postmann klopfte.
Gespannt kann man auch auf den Kernel-Web-Dämon sein, der nach ersten Versuchen einem Webserver einen gravierend gesteigerten Durchsatz ermöglicht.
Ein kleines Manko hat er dann doch, denn das lang ersehnte Journaling Filesystem hat noch immer keinen Platz im Kernelkode erhalten. So ist die einzig relevante Erweiterung im Dateisystem (neben den 64 Bit) der schreibende Zugriff auf OS/2-Partitionen.
Aussichten |
Die Version 2.4 ist noch nicht einmal veröffentlicht, da kursieren im Internet schon wieder die Wunschlisten für die kommenden Revisionen. Inwiefern die Vorstellungen tatsächlich Einzug in die Sourcen finden, ist unmöglich abzuschätzen. Dennoch sollen die - meiner Meinung nach - interessantesten Vorschläge diesen Abschnitt ausklingen lassen: