Linux (Kernel)
Dieser Artikel behandelt nur den Linux-Kernel, insbesondere technische Aspekte. Weiteres, insbesondere zu Geschichte und Betriebssystem unter Linux oder Linux-Distribution
Datei:Tux kl.png |
Tux, der Linux-Pinguin. |
Der Linux-Kernel ist ein UNIX-artiger Betriebssystem-Kern der 1991 von dem Finnen Linus Torvalds für die x86-Architektur geschrieben wurde. Er steht unter der freien GPL-Lizenz.
Er bildet die hardwareabstrahierende Schicht, d.h. er stellt der auf dieser Basis aufsetzenden Software eine einheitliche Schnittstelle unabhängig von der Hardware-Architektur zur Verfügung.
Detailliert
Er stellt das Basis-System dar, das zwischen dem BIOS der Hardware und der höheren Software liegt und macht die Hardware für die auf dem System laufenden Anwendungen durch ein einheitliches API verfügbar. Der Kernel ist damit z.B. zuständig für Prozessverwaltung, Multitasking, Eingabe/Ausgabe-Operationen auf verschiedenen Geräten wie Festplatten oder Netzwerkkarten, Lastverteilung und Sicherheitserzwingung. Der Kernel ist noch kein komplettes Betriebssystem im landläufigen Sinne, da er ohne weitere Programme relativ nutzlos ist.
Der Linux-Kernel ist fast komplett in C geschrieben, wobei einige GNU C-Erweiterungen benutzt werden. Eine Ausnahme bilden die Architekturabhängigen Teile des Codes (/usr/src/linux/arch/), wie z. B. der Beginn des Bootvorganges, die in Assembler geschrieben sind.
Neue "offizielle" Kernel-Versionen werden weiterhin von Torvalds selbst veröffentlicht, der die Beiträge anderer Programmierer sammelt und auch selbst Änderungen vornimmt. Alle Linux-Versionen, bei denen die Sub-Version (die zweite Zahl) im Versionsstring eine gerade Zahl ist, gehören zu so genannten "stabilen" Serien, bislang gab es 1.0.x, 1.2.x, 2.0.x, 2.2.x, 2.4.x und die neue 2.6.x, wohingegen Releases mit ungerader Sub-Version, wie z.B. die 2.5er Reihe, Entwickler-Versionen sind, in denen mit neuen (und potenziell auch "gefährlichen") Features experimentiert wird, und die daher auch nicht für den Einsatz in Produktivumgebungen empfohlen werden. Während Torvalds die neuesten Entwicklungs-Versionen veröffentlicht, wurde die Pflege der älteren "stabilen" Versionen an andere Programmierer abgegeben, gegenwärtig ist David Weinehall für die 2.0er Serie verantwortlich, Alan Cox für den Kernel 2.2, Marcelo Tosatti für den Kernel 2.4 und Andrew Morton für den aktuellen stabilen Kernel 2.6. Zusätzlich zu diesen offiziellen und über www.kernel.org oder einen seiner Mirrors zu beziehenden Kernel-Quellcodes kann man auch alternative "Kernel-Trees" aus anderen Quellen benutzen. Distributoren von Linux-basierten Betriebssystemen pflegen meistens ihre eigenen Versionen des Kernels und beschäftigen zu diesem Zwecke fest angestellte Kernel-Hacker, die ihre Änderungen meist auch in die offiziellen Kernels einfließen lassen. Distributions-Kernel sind häufig intensiv gepatcht, um auch Treiber zu beinhalten, die noch nicht im offiziellen Kernel sind, von denen der Distributor aber glaubt, dass seine Kundschaft sie benötigen könnte.
Die aktuelle stabile Kernelserie wurde kürzlich veröffentlich, daher gibt es im Moment keinen Entwicklungskernel. In Kürze wird Linus Torvalds aber wohl mit dem neuen Entwicklungszweig 2.7 beginnen.
Erscheinungstermine:
17. September | 1991 Initial Public Release | v0.01 |
5. Oktober | 1991 Erster "offizieller" Kernel | v0.02 |
16. April | 1994 | v1.0 |
9. Juni | 1996 | v2.0 |
21. Januar | 1999 | v2.2.0 |
4. Januar | 2001 | v2.4.0 |
18. Dezember | 2003 | v2.6.0 |
Architektur
Linux ist heute ein hybrid monolithischer Kernel. Dies bedeutet, dass man den größten Teil der Treiber, die nicht während der ersten Startphase (bevor ein Dateisystem eingebunden ist) benötigt werden, als Module konfigurieren kann, die dann dynamisch nachgeladen oder auch während des Betriebs entladen werden können, wenn ihre Funktionalität nicht mehr benötigt wird. Die Treiber im Kernel und die Kernel-Module laufen im Ring 0, haben also unbeschränkten Zugriff auf die Hardware. Einige wenige Module des Kernels laufen im eingeschränkten Ring 3 (Usermodus). Die Level 1 und 2 der x86-Architektur werden vom Linux-Kernel nicht genutzt.
Die Tatsache, dass Linux kein Microkernel ist, war Thema eines berühmten Flame War 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 Möglichkeit, auch Module verwenden zu können, wurde erst später nachgerüstet). Eine Zusammenfassung der Diskussion zwischen Torvalds und Tanenbaum kann unter http://www.dina.dk/~abraham/Linus_vs_Tanenbaum.html gefunden werden.
Portierbarkeit
Obwohl Linus Torvalds eigentlich nicht beabsichtigt hatte, einen portierbaren Kernel zu schreiben, hat sich Linux doch in diese Richtung entwickelt, es ist inzwischen das am zweithäufigsten portierte System (nur NetBSD läuft auf noch mehr Architekturen). Das Repertoire reicht dabei von eher exotischen Betriebsumgebungen wie dem iPAQ-Handheld-Computer oder gar Digitalkameras bis hin zu IBMs S/390 zSeries, einem großen und sehr teueren Großrechnersystem. Obwohl die Portierung auf die S/390 ursprünglich ein vom IBM-Management nicht genehmigtes Unterfangen war (siehe auch: Skunk Works), hat Big Blue wohl inzwischen Gefallen am Linux-System gefunden, und so soll auch die nächste IBM-Supercomputer-Generation Blue Gene mit einem eigenen Linux-Port ausgestattet werden, sobald sie fertig ist.
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 jedermann eine einfache Möglichkeit bietet, auf einem freien System freie Software laufen zu lassen.
Linux läuft gegenwärtig auf den folgenden Architekturen:
- Acorn Archimedes, A5000 und RiscPC Serie (ARM, StrongARM, Intel XScale etc.)
- AMD64: AMD's 64-bit Prozessor (auch bekannt als x86-64)
- Axis Communications' CRIS
- Compaq Alpha-Prozessor
- Hitachi H8/300
- Hewlett Packard PA-RISC
- IA-64: PCs mit 64bit Intel Itanium-Prozessor
- IBM S/390
- Intel 80386 und neuer: IBM PCs und kompatible mit den CPUs 80386, 80486, und Pentium-Serie; AMD Athlon, Duron, Thunderbird; Cyrix-Prozessoren. Unterstützuung für Intel 8086, 8088, 80186, 80188 und 80286 CPUs wird derzeit entwickelt (siehe auch ELKS-Projekt)
- MIPS: Maschinen von Silicon Graphics...
- Motorola 68020 und neuer: neuere Amigas, einige Apple Computer
- NEC v850e
- PowerPC: die meisten neueren Apple Computer (alle PCI-basierten Power Macintosh, begrenzte Unterstützung für NuBus Power Macs), Clones der Power Macs von Power Computing, UMAX und Motorola, mit einer "Power-UP"-Karte verbesserte Amigas (z.B. Blizzard oder CyberStorm), sowohl POWER als auch PowerPC-basierte IBM RS/6000-Systeme, verschiedenen embedded PowerPC-Plattformen
- Sun SPARC und UltraSparc: Sun-Workstations
- Hitachi SuperH: SEGA Dreamcast
- Sony PlayStation 2
- Microsoft's Xbox
Ein besonderer Port ist das User-Mode Linux. Prinzipiell handelt es sich dabei um einen Port des Linux-Kernels auf sein eigenes Systemcall-Interface. Dies ermöglicht es, einen Linux-Kernel als normalen Prozess auf einem laufenden Linux-System zu starten. Der User-Mode-Kernel greift dann nicht selbst auf die Hardware zu, sondern reicht entsprechende Anforderungen an den echten Kernel durch. Durch diese Konstellation werden "Sandboxen" ähnlich den Virtual Machines von Java möglich, in denen ein normaler Benutzer Root-Rechte haben kann, ohne dem tatsächlichen System schaden zu können. Ein weiteres denkbares Einsatzgebiet für User-Mode Linux ist die Treiberentwicklung für den Linux-Kernel, da man einen User-Mode-Prozess leichter als einen vollwertigen Kernel debuggen kann. Außerdem ist ein Kernel-Oops (Halt des Systems auf Grund eines Kernel-Fehlers) bei einem virtuellen Kernel für das tatsächliche System folgenlos, man kann problemlos einen neuen oder sogar mehrere virtuelle Kernel gleichzeitig starten (dies ist z.B. für Anbieter von dedizierten Webservern interessant, die dadurch dem Kunden auf ein und dem gleichen System die Linux-Distribution seiner Wahl anbieten können).
Neuerungen im Kernel 2.6
Der neue stabile Kernel wurde ab Dezember 2001 auf Basis des damaligen 2.4er Kernels entwickelt und wird eine Reihe von Neuerungen einführen.
Die wohl offensichtlichste Änderung gegenüber Version 2.4 zeigt sich, wenn man zum ersten Mal eine grafische Oberfläche auf dem neuen Kernel startet: Die X-Oberfläche fühlt sich spürbar "schneller" und reaktionsfreudiger an, und andere interaktive Anwendungen wie z.B. Soundwiedergabe laufen nun auch unter hoher Last ohne Aussetzer. Dies wurde durch eine Reihe von Maßnahmen erreicht, die im folgenden besprochen werden sollen:
- Neuer O(1)-Scheduler und verbessertes Thread-Management
- Prozesse werden nicht mehr alle 1/100 Sekunde, sondern 1/1000 Sekunde unterbrochen
- Der Kernel ist nun voll präemptiv
Der O(1)-Scheduler
In einem Multitasking-fähigen Betriebssystem muss es eine Instanz geben, die den Prozessen, die laufen wollen, Rechenzeit zuteilt und sie nach Ablauf der zugeteilten Zeitspanne (Timeslice) wieder "schlafen legt". Diese Instanz bildet der sog. Scheduler, den Ingo Molnar für den 2.6er Kernel komplett neu konzipiert und implementiert hat. Der neue O(1)-Scheduler erhielt seinen Namen, weil die relevanten Algorithmen, auf denen der Scheduler basiert, die Komplexität O(1) haben. Der O(1)-Scheduler arbeitet daher sehr effizient und benötigt für den eigenen Betrieb nur sehr wenig Rechenzeit. Er verwendet prinzipiell zwei verkettete Listen, in denen die Prozesse eingetragen sind, die noch laufen wollen, und diejenigen, die bereits gelaufen sind. Nachdem alle Prozesse in der zweiten Liste stehen, werden die Arrays getauscht, und das Spiel beginnt von neuem. Der Scheduler ist darüber hinaus so ausgelegt, dass Prozesse, die große Mengen Rechenzeit in Anspruch nehmen wollen, gegenüber interaktiven Prozessen benachteiligt werden, wenn beide zur gleichen Zeit laufen wollen. Interaktive Prozesse benötigen meist nur sehr wenig Rechenzeit, sind aber häufig sehr zeitkritisch (so will man z.B. nicht ewig auf eine Reaktion der grafischen Oberfläche warten). Der neue Scheduler besitzt ausgefeilte Algorithmen, um festzustellen, ob ein Prozess interaktiv ist oder die CPU eher lange belegt. Gegenwärtig arbeiten mehrere Kernel-Programmierer noch daran, gewisse Grenzfälle auszubalancieren (ein Prozess wird plötzlich von einem interaktiven zu einem CPU-lastigen und umgekehrt). Der interne "Takt" des Kernels wurde von 100 Hz auf 1000 Hz erhöht, d.h. die maximale Länge eines Timeslice beträgt nun 1/1000 Sekunde. Auch hiervon profitieren besonders die interaktiven Prozesse, da sie früher "wieder an der Reihe sind". Eine weitere Stärke des neuen Schedulers liegt im verbesserten Thread-Management und der besseren Unterstützung von symmetrischem Multi-Processing (SMP) und Hyperthreading. Dies kommt vor allem hoch belasteten Servern zugute. In Testsituationen konnten unter dem neuen Scheduler 100.000 Threads aufgemacht werden, ohne dass das System subjektiv langsamer wurde. Weiterhin sorgt der neue Scheduler dafür, dass die zur Verfügung stehenden CPUs optimal ausgelastet werden, ohne Prozesse übermäßig oft zwischen zwei CPUs hin- und her wechseln zu lassen.
Präemptiver Kernel
Der Kernel ist ab Version 2.6 in den meisten Funktionen präemptiv, d.h. selbst wenn das System gerade im Kernel-Mode Aufgaben ausführt, kann dieser Vorgang durch einen Prozess aus dem User-Mode unterbrochen werden. Der Kernel macht dann weiter, wenn der Usermode-Prozess seinen Timeslice aufgebraucht hat. Dies funktioniert bis auf einige Kernel-Funktionen, die atomar (nicht unterbrechbar) ablaufen müssen, sehr gut und kommt ebenfalls der Interaktivität zugute.
Lizenz
Making Linux GPL'd was definitely the best thing I ever did. -- Linus Torvalds [1]
Torvalds gab Linux ursprünglich unter einer Lizenz heraus, die jede kommerzielle Nutzung verbot. Diese Lizenz tauschte er bald gegen die GNU General Public License (Version 2). Sie erlaubt die Verteilung und sogar den Verkauf von (auch veränderten) Versionen von Linux. Die Bedingungen hierfür sind, dass alle Kopien auch unter der selben Lizenz stehen müssen und der Quelltext immer mitgeliefert werden muss.
Weblinks
- Das Linux-Kernel Archiv
- Das "Post-Halloween-Dokument" - Überblick über die Änderungen zum 2.6-Kernel (deutsch)
- The Wonderful World of Linux 2.6 – von Joseph Pranevich