Dies ist ein als lesenswert ausgezeichneter Artikel.

„Linux (Kernel)“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
[ungesichtete Version][ungesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
AZ: Der Seiteninhalt wurde durch einen anderen Text ersetzt.
Peter200 (Diskussion | Beiträge)
K Änderungen von 193.158.91.6 (Beiträge) rückgängig gemacht und letzte Version von 131.130.236.22 wiederhergestellt
Zeile 1: Zeile 1:
{{Infobox Betriebssystem-Linux
== '''KNOPPIX !!!!''' ==
|Name=Linux (Kernel)
|Entwickler=[[Linus Torvalds]] u.v.m.
|Version=[[#Erscheinungstermine|Erscheinungstermine]]
|Freigabedatum=[[1991]]–[[2007]]
|Größe=6,0–36,6 [[Megabyte|MB]] ''(gepackt)''
|Startmedium=[[Festplatte]], [[CD-ROM]], [[DVD-ROM]], [[Diskette]], [[Netzwerk]], [[USB-Stick]]
|Stammbaum=–
|Architekturen= [[IA-32]], [[Alpha AXP]], [[Sun SPARC]], [[Motorola 68000]], [[PowerPC]], [[ARM]], [[SuperH|Hitachi SuperH]], [[IBM S/390]], [[MIPS]], [[PA-RISC|HP PA-RISC]], [[IA-64]], [[x86-64]], [[ETRAX CRIS|AXIS CRIS]], [[Renesas M32R]], [[Atmel AVR32]], [[Renesas H8|Renesas H8/300]], [[NEC V850]], [[Tensilica Xtensa]] und [[Blackfin]]
|Lizenz=[[GNU General Public License|GPL]]
|Sonstiges=Preis: [[Freie Software|beliebig]]<br />Sprache: [[Englische Sprache|Englisch]]
|Website=[http://kernel.org kernel.org]
}}

'''Linux''' ist ein [[Betriebssystemkern]] (engl. ''Kernel''), der im [[Linux (Betriebssystem)|gleichnamigen]] und anderen [[Betriebssystem]]en zum Einsatz kommt.

Linux wurde ursprünglich [[1991]] vom Finnen [[Linus Torvalds]], der auch heute noch die Entwicklung koordiniert, für die [[x86]]-Architektur geschrieben. Es steht unter der [[freie Software|freien]] [[GNU General Public License|GNU General Public License (GPL)]].

== Grundlegende Technologie ==

=== Aufgaben des Kernels ===
Der Kernel eines Betriebssystems bildet die hardwareabstrahierende Schicht ([[Hardware Abstraction Layer]]), d.&nbsp;h. er stellt der auf dieser Basis aufsetzenden [[Software]] eine einheitliche [[Schnittstelle]] ([[Application Programming Interface|API]]) zur Verfügung, die unabhängig von der [[Rechnerarchitektur]] ist. Die Software kann so immer auf die Schnittstelle zugreifen und braucht die Hardware selbst, die sie nutzt, nicht genauer zu kennen. Linux ist dabei ein modularer [[Monolithischer Kernel|monolithischer Betriebssystemkern]] und zuständig für [[Speicherverwaltung]], [[Scheduling|Prozessverwaltung]], [[Multitasking]], Lastverteilung, Sicherheitserzwingung und Eingabe/Ausgabe-Operationen auf verschiedenen Geräten.

''Siehe auch:'' [[Betriebssystemkern]]

=== Programmiersprache ===
Linux ist fast komplett in der Programmiersprache [[C (Programmiersprache)|C]] geschrieben, wobei einige [[GNU-Projekt|GNU]]-C-Erweiterungen benutzt werden. Eine Ausnahme bilden die architekturabhängigen Teile des Codes (im Verzeichnis ''arch'' innerhalb der Linux-[[Quelltext|Sourcen]]), wie z.&nbsp;B. der Beginn des [[Booten|Boot]]vorganges, die in [[Assemblersprache]] geschrieben sind.

=== 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 Speicher 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 [[Basic Input Output System|BIOS]] des Systems, u.&nbsp;a. auf die Erweiterungen gemäß den Standards [[Advanced Power Management|APM]], [[Advanced Configuration and Power Interface|ACPI]] und [[Video Electronics Standards Association|VESA]]. Um unter diesen Voraussetzungen [[x86]]-kompatible Hardware z.&nbsp;B. auf der [[Digital Equipment Corporation|DEC]]-[[Alpha-Prozessor|Alpha]]-Plattform zu betreiben, werden teilweise sogar [[Emulator]]en zur Ausführung entsprechenden [[Read-Only-Memory|ROM]]-[[Code]]s verwendet. Linux selbst übernimmt das System beim Bootprozess typischerweise in dem Moment, wo der [[Basic Input Output System|BIOS]]-[[Bootloader]] erfolgreich war und alle Systeminitialisierungen des [[Basic Input Output System|BIOS]] abgeschlossen sind.

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

''Siehe auch:'' [[Gerätenamen unter Linux]], [[Network Block Device]], [[Linux (Betriebssystem)]]

=== Architektur ===
Linux ist ein [[monolithisch]]er Kernel. Die Treiber im Kernel und die Kernel-[[Module]] laufen im [[Privileg|privilegierten]] Modus (x86: [[Ring (CPU)|Ring]]&nbsp;0), haben also unbeschränkten Zugriff auf die [[Hardware]]. Einige wenige Module des Kernels laufen im eingeschränkten Benutzermodus (x86: Ring&nbsp;3). Die ''Level'' 1 und 2 der [[x86]]-Architektur werden von Linux nicht genutzt.

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 [[initrd|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 (''user mode''), während der Kernel im Kernel-Modus (''kernel mode'') 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.&nbsp;B. durch einen [[Programmfehler|Fehler]] so 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.&nbsp;B. [[virtueller Speicher]], Illusion eines eigenen Prozessors etc.).

{| align="center"
|[[Bild:Linux_schichten.png|center|Abstraktionsschichten unter Linux]]
|-
| align="center" | Fast vollständige Abstraktion unter Linux
|}

Die Tatsache, dass Linux nicht auf einem [[Mikrokernel]] basiert, war Thema eines berühmten [[Flame War]]s 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 [[Filesystem in Userspace|FUSE]] und durch die zunehmende Verwendung von Kernel-Prozessen fließen mittlerweile auch [[Mikrokernel]]-Konzepte ein.

=== Portierbarkeit ===
Obwohl Linus Torvalds eigentlich nicht beabsichtigt hatte, einen [[Portierung|portierbaren]] Kernel zu schreiben, hat sich Linux dank des GNU Compilers [[GNU Compiler Collection|GCC]] doch in diese Richtung entwickelt. Es ist inzwischen mit eines der am häufigsten portierten Systeme (nur noch [[NetBSD]] läuft auf etwa gleich vielen Architekturen). Das Repertoire reicht dabei von eher selten anzutreffenden Betriebsumgebungen wie dem [[iPAQ]]-Handheld-Computer, [[Digitalkamera]]s oder Großrechnern wie IBMs [[zSeries]] bis hin zu normalen Home-PCs.

Obwohl die Portierung auf die S/390 ursprünglich ein vom IBM-Management nicht genehmigtes Unterfangen war (''siehe auch: [[Skunk Works]]''), hat [[IBM]] wohl inzwischen Gefallen am Linux-System gefunden, und so soll auch die nächste IBM-Supercomputergeneration [[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 jedem eine einfache Möglichkeit bietet, auf einem freien System freie Software laufen zu lassen.

Linux läuft gegenwärtig auf den folgenden Architekturen:
* [[Acorn]] [[Acorn Archimedes|Archimedes]], [[A5000]] und [[Risc PC|RiscPC]]-Serie ([[ARM-Architektur|ARM]], [[StrongARM]], Intel [[XScale]] etc.)
* [[AMD64]] (auch bekannt als x86–64): [[Advanced Micro Devices|AMD]]s 64-bit Prozessoren [[Athlon 64]], [[Opteron]] und [[Turion]], sowie Intel-Prozessoren mit EM64T-Erweiterung ([[Xeon]] 4E)
* [[Axis Communications]]' [[ETRAX CRIS|CRIS]]
* [[Compaq]] [[Alpha-Prozessor]]
* [[Hitachi (Unternehmen)|Hitachi]] [[Hitachi H8|H8/300]]
* [[Hewlett Packard]] [[PA-RISC]]
* [[IA-64]]: PCs mit 64bit [[Intel]] [[Itanium]]-Prozessor
* [[IBM]] [[S/390]] und [[zSeries]]
* [[Intel]] [[Intel 80386|80386]] und neuer: [[IBM-PC]]s und kompatible mit den CPUs [[Intel 80386|80386]], [[I486|80486]], und [[Pentium]]-Serie; [[Advanced Micro Devices|AMD]] [[Athlon]], [[Duron]], [[Thunderbird]]; [[Cyrix]]-Prozessoren. Unterstützung für Intel [[Intel 8086|8086]], [[Intel 8088|8088]], [[Intel 80186|80186]], [[Intel 80186|80188]] und [[Intel 80286|80286]] CPUs wird derzeit entwickelt (siehe auch das [[ELKS]]-Projekt)
* [[MIPS-Architektur|MIPS]]: Maschinen von [[Silicon Graphics]]&nbsp;…
* [[Motorola]] [[Motorola 68020|68020]] und neuer: neuere [[Amiga]]s, einige [[Atari]] und [[Apple Computer]] (siehe [[Linux68k]])
* [[NEC Corporation|NEC]] [[v850]]e
* [[PowerPC]]: die meisten neueren [[Apple Computer]] (alle PCI-basierten [[Power Macintosh]], der [[Gamecube]], begrenzte Unterstützung für [[NuBus]] Power Macs), Clones der Power Macs von [[Power Computing]], [[UMAX]] und [[Motorola]], mit einer „Power-UP“-Karte verbesserte [[Amiga]]s (z.&nbsp;B. Blizzard oder CyberStorm), sowohl [[POWER]] als auch PowerPC-basierte [[IBM]] [[RS/6000]]-Systeme, verschiedenen eingebetteten PowerPC-Plattformen
* [[Sun SPARC]] und [[UltraSparc]]: [[Sun Microsystems|Sun]]-Workstations
* [[Hitachi (Unternehmen)|Hitachi]] [[SuperH]]: [[Sega]] [[Dreamcast]]

==== User Mode Linux ====
Ein besonderer Port ist das ''[[User Mode Linux]] (UML)''. Prinzipiell handelt es sich dabei um einen Port von Linux 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 „[[Sandbox|Sandkästen]]“ ähnlich den [[Virtual Machine]]s von [[Java (Programmiersprache)|Java]] oder den ''Jails'' von [[FreeBSD]] möglich, in denen ein normaler Benutzer Root-Rechte haben kann, ohne dem tatsächlichen System schaden zu können.

==== µClinux ====
''[[µClinux]]'' ist eine Linux-Variante für Computer ohne [[Memory Management Unit]] (''MMU'') und kommt vorwiegend auf [[Microcontroller]]n und [[eingebettetes System|eingebetteten Systemen]] zum Einsatz. Seit Linux-Version 2.6 ist ''µClinux'' Teil des Linux-Projektes.

==== ELKS ====
''[[ELKS]]'', das ''Embeddable Linux Kernel Subset'' ist eine Kernel-Untermenge die auf x86-kompatiblen 16bit Prozessoren (8086/80286) lauffähig ist.

== Kernel-Versionen ==

Auf der Website ''kernel.org'' werden alle alten und neuen Kernel-Versionen archiviert. Die dort befindlichen Referenzkernel werden auch als ''Vanilla-Kernel'' bezeichnet (von umgangssprachlich engl. ''vanilla'' für ''Standard'' bzw. ''ohne Extras'' im Vergleich zu Distributionskernels). Auf diesem bauen die sogenannten Distributionskernel auf, die von den einzelnen [[Linux-Distribution]]en um weitere Funktionen ergänzt werden.

=== Versionsnummern-Schema ===
Die Versionen von Linux folgen dabei einem bestimmten Schema:

Die ''erste Ziffer'' wird nur bei grundlegenden Änderungen in der Systemarchitektur angehoben. Während der Entwicklung des 2.5er Kernels kam wegen der relativ grundlegenden Änderungen, verglichen mit dem 2.4er Kernel, die Diskussion unter den Kernel-Programmierern auf, den nächsten Produktionskernel als 3.0 zu deklarieren. Torvalds war aber aus verschiedenen Gründen dagegen, sodass der resultierende Kernel als 2.6 bezeichnet wurde.

Die ''zweite Ziffer'' gibt das jeweilige „Majorrelease“ an. Bisher wurden stabile Versionen (sogenannte Produktionskernel) von den Entwicklern stets durch gerade Ziffern wie 2.2, 2.4 und 2.6 gekennzeichnet, während die Testversionen (sogenannte Entwicklerkernel) immer ungerade Ziffern trugen, wie z.&nbsp;B. 2.3 und 2.5; diese Trennung ist aber seit Juli 2004 ausgesetzt, es gibt zur Zeit (2006) keinen Entwicklerkernel mit der Nummer 2.7, stattdessen werden die Änderungen laufend in die 2.6er-Serie eingearbeitet.

Zusätzlich bezeichnet eine ''dritte Zahl'' das „Minorrelease“, das die eigentliche Version kennzeichnet. Werden neue Funktionen hinzugefügt, steigt die dritte Zahl an. Der Kernel wird damit zum Beispiel mit einer [[Versionsnummer]] wie 2.6.7 bestimmt.

Um die Korrektur eines schwerwiegenden [[Network File System|NFS]]-Fehlers schneller verbreiten zu können, wurde mit der Version 2.6.8.1 erstmals eine ''vierte Ziffer'' eingeführt. Seit März 2005 (Kernel 2.6.11) wird diese Nummerierung offiziell verwendet <ref name="heise_versionsnummern">Thorsten Leemhuis: ''[http://www.heise.de/newsticker/meldung/57122 Neue Kernel-Serie mit Linux 2.6.11.1 gestartet]'' auf heise.de, 7. März 2005</ref>. So ist es möglich, die Stabilität des Kernels trotz teilweise sehr schneller Veröffentlichungszyklen zu gewährleisten und Korrekturen von kritischen Fehlern innerhalb weniger Stunden in den offiziellen Kernel zu übernehmen – wobei sich die vierte Ziffer erhöht (z.&nbsp;B. von 2.6.11.'''1''' auf 2.6.11.'''2'''). Die Minorreleasenummer, also die dritte Ziffer, wird hingegen nur bei Einführung neuer Funktionen hochgezählt.

=== Entwicklerversion ===
Neue Funktionen finden sich im sogenannten ''-mm'' Kernel des Kernelentwicklers [[Andrew Morton]] und werden anschließend in den Hauptzweig von Torvalds übernommen. Somit werden große Unterschiede zwischen Entwicklungs- und Produktionskernel und damit verbundene Portierungsprobleme zwischen den beiden Serien vermieden. Durch dieses Verfahren gibt es auch weniger Differenzen zwischen dem offiziellen Kernel und den Distributionskernel (früher wurden Features des Entwicklungszweiges von den Distributoren häufig in ihre eigenen Kernels rückintegriert). Allerdings litt 2004/2005 die Stabilität des 2.6er Kernels unter den häufig zu schnell übernommenen Änderungen. Ende Juli 2005 wurde deshalb ein neues Entwicklungsmodell beschlossen, das nach dem Erscheinen der Version 2.6.13 erstmals zur Anwendung kommt: Neuerungen werden nur noch in den ersten zwei Wochen der Kernelentwicklung angenommen, wobei anschließend eine Qualitätssicherung bis zum endgültigen Erscheinen der neuen Version erfolgt.

=== Pflege der Kernel-Versionen ===
Während Torvalds die neuesten Entwicklungsversionen 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, [[Marc-Christian Petersen]] (zuvor Alan Cox) für den Kernel 2.2, [[Willy Tarreau]] (zuvor [[Marcelo Tosatti]]) für den Kernel 2.4, [[Greg Kroah-Hartmann]] und [[Chris Wright (Programmierer)|Chris Wright]] für die aktuellen stabilen Kernel 2.6.x.y(-stable), [[Linus Torvalds]] für die aktuellen „normalen“ Kernel 2.6.x, und [[Andrew Morton]] für seinen experimentellen -mm-Zweig, basierend auf dem neuesten 2.6.x. Zusätzlich zu diesen offiziellen und über Kernel.org oder einen seiner [[Mirror]]s zu beziehenden Kernel-Quellcodes kann man auch alternative „Kernel-Trees“ aus anderen Quellen benutzen. [[Distributor]]en 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 enthalten, die noch nicht im offiziellen Kernel enthalten sind, von denen der Distributor aber glaubt, dass seine Kundschaft sie benötigen könnte und die notwendige Stabilität respektive Fehlerfreiheit dennoch gewährleistet ist.

=== Erscheinungstermine ===
{| class="prettytable"
|- style="background-color:#efefef;"
! Version
! Datum
! Anmerkung
! Aktuell
|-
| 0.01 || 17. September 1991 || Initial Public Release || –
|- style="background-color:#f0f0ff"
| 0.02 || 5. Oktober 1991 || || –
|-
| 1.0.0 || 13. März 1994 || || –
|- style="background-color:#f0f0ff"
| 1.1.0 || 6. April 1994 || Entwicklungsversion || –
|-
| 1.2.0 || 7. März 1995 || || –
|- style="background-color:#f0f0ff"
| 1.3.0 || 12. Juni 1995 || Entwicklungsversion|| –
|-
| 2.0.0 || 9. Juni 1996 || || 2.0.40
|- style="background-color:#f0f0ff"
| 2.1.0 || 30. September 1996 || Entwicklungsversion || –
|-
| 2.2.0 || 26. Januar 1999 || || 2.2.26
|- style="background-color:#f0f0ff"
| 2.3.0 || 11. Mai 1999 || Entwicklungsversion || –
|-
| 2.4.0 || 4. Januar 2001 || || 2.4.35.3
|- style="background-color:#f0f0ff"
| 2.5.0 || 23. November 2001 || Entwicklungsversion || –
|-
| 2.6.0 ||18. Dezember 2003 || || 2.6.23
|}

== Neuerungen im Kernel 2.6 ==

Die Kernel-Reihe 2.6 wurde ab Dezember [[2001]] auf Basis des damaligen 2.4er Kernels entwickelt und wies umfangreiche Neuerungen auf. Für die Entwicklung war der neue Kernel-Code übersichtlicher und leichter zu pflegen, während Anwender durch die Überarbeitung der Scheduler und des I/O-Bereichs und von geringeren Latenzzeiten profitierten <ref name="heise_kernel26">Dr. Oliver Diedrich: ''[http://www.heise.de/ct/03/24/194/ The Next Generation - Linux 2.6: Fit für die Zukunft]'' in der c't 24/2003, Seite 194</ref>. Dies wurde durch eine Reihe von Maßnahmen erreicht, die im Folgenden besprochen werden sollen:

=== 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. ''[[Prozess-Scheduler|Scheduler]]'', den [[Ingo Molnár]] für den 2.6er Kernel komplett neu konzipiert und implementiert hat.

Der O(1)-Scheduler erhielt seinen Namen, weil die relevanten [[Algorithmus|Algorithmen]], auf denen der Scheduler basiert, die [[Komplexität (Informatik)|Komplexität]] O(1) haben. Dies bedeutet, dass die vom Scheduler für eigene Aufgaben benötigte Prozessorzeit unabhängig von der Anzahl der verwalteten Prozesse bzw. Threads ist. Insbesondere wird etwa auf Durchsuchen aller Prozesse nach dem „besten“ etc. verzichtet.

Der O(1)-Scheduler arbeitet daher auch bei sehr vielen Prozessen überaus effizient und benötigt selbst 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. Wenn alle Prozesse in der zweiten Liste stehen, werden die [[Array]]s 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 in der Regel nur sehr wenig Rechenzeit, sind dafür aber sehr zeitkritisch (so will man z.&nbsp;B. nicht ewig auf eine Reaktion der grafischen Oberfläche warten). Der Scheduler besitzt ausgefeilte [[Heuristik]]en, um festzustellen, ob ein Prozess interaktiv ist oder die CPU eher lange belegt.

Gegenwärtig arbeiten mehrere Kernelprogrammierer 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 ab dem Kernel 2.6 von 100 Hz auf 1000 Hz erhöht, das heißt, die kürzestmögliche Länge einer Zeitscheibe beträgt nun eine Millisekunde. Auch hiervon profitieren besonders die interaktiven Prozesse, da sie früher „wieder an der Reihe sind“. Da dies aber zu einer erhöhten CPU-Last und somit zu einem größeren Stromverbrauch führt, entschied man sich, den Takt ab dem Kernel 2.6.13 auf 250 Hz voreinzustellen. Bei der Konfiguration des Kernels sind jedoch auch noch die Werte 100 Hz und 1000 Hz wählbar.

Eine weitere Stärke dieses Schedulers liegt im verbesserten [[Thread (Informatik)|Thread]]-Management und der besseren Unterstützung von symmetrischem Multiprocessing (SMP) und [[Hyper-Threading]]. Dies kommt vor allem hoch belasteten [[Server]]n zugute. In Testsituationen konnten unter diesem Scheduler 100.000 [[Thread (Informatik)|Threads]] gestartet 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 herwechseln zu lassen.

Mit der Kernelversion 2.6.23 wurde im Oktober 2007 der O(1)-Scheduler durch einen sog. [[Completely-Fair-Scheduler]] ersetzt, der ebenfalls von Ingo Molnár entwickelt wurde.

=== Präemptiver Kernel ===
Der Kernel ist ab Version 2.6 in den meisten Funktionen [[präemptives Multitasking|präemptiv]], d.&nbsp;h. selbst wenn das System gerade im [[Ring (CPU)|Kernel-Modus]] Aufgaben ausführt, kann dieser Vorgang durch einen Prozess aus dem [[Ring (CPU)|User-Modus]] unterbrochen werden. Der Kernel macht dann weiter, wenn der Usermodus-Prozess seine Timeslice aufgebraucht hat oder selbst einen Re-Schedule anfordert, also dem Scheduler mitteilt, dass er einen anderen Task ausführen kann. Dies funktioniert, bis auf einige Kernel-Funktionen, die [[Atomare Operation|atomar]] (nicht unterbrechbar) ablaufen müssen, sehr gut und kommt ebenfalls der Interaktivität zugute.

=== Zugriffskontrolllisten ===
Mit dem Kernel 2.6 werden für Linux erstmals [[Zugriffskontrollliste]]n (''access control lists'') nativ eingeführt. Diese sehr feinkörnige Rechteverwaltung ermöglicht es vor allem Systemadministratoren, die Rechte auf einem Dateisystem unabhängig vom Gruppen- und Nutzermodell zu gestalten und dabei faktisch beliebig viele spezielle Rechte pro Datei zu setzen. Die mangelnde Unterstützung von Zugriffskontrolllisten von Linux wurde vorher als massive Schwäche des Systems im Rahmen der Rechteverwaltung und der Möglichkeiten zur sicheren Konfiguration gesehen.

Die Unterstützung von Zugriffskontrolllisten funktioniert dabei mit den Dateisystemen [[ext2]], [[ext3]], [[Journaled File System|jfs]] und [[XFS (Dateisystem)|XFS]] nativ.

=== Inotify ===
Mit dem Kernel 2.6.13 hält erstmals ''Inotify'' Einzug in den Kernel. Dies ermöglicht das permanente Überwachen von Dateien und Ordnern: Wird eines der überwachten Objekte geändert oder ein neues Objekt im Überwachungsraum erschaffen, gibt Inotify eine Meldung aus, die wiederum andere Programme zu definierten Tätigkeiten veranlassen kann. Dies ist insbesondere für Such- und Indexierungsmechanismen der Datenbestände von entscheidender Bedeutung, und ermöglicht erst den sinnvollen Einsatz von Desktop-Suchmaschinen wie [[Kat (Software)|Kat]] oder [[Beagle (GNOME)|Beagle]]. Ohne eine solche Benachrichtigungsfunktion des Kernels müsste ein Prozess die zu überwachende Datei bzw. den zu überwachenden Ordner in bestimmten Zeitintervallen auf Änderungen überprüfen, was im Gegensatz zu Inotify zusätzliche Performance-Einbußen mit sich brächte.

=== Weitere wichtige Änderungen ===
Soweit es möglich ist, wird in Linux 2.6 die Maximalzahl für bestimmte Ressourcen angehoben. Die Anzahl von möglichen Benutzern und Gruppen wurde von 65.000 auf über 4 Milliarden erhöht, ebenso wie die Anzahl der Prozess-IDs (von 32.000 auf 1 Milliarde) und die Anzahl der Geräte (Major/Minor-Nummern). Weitere leistungssteigernde Maßnahmen betrafen die I/O-Scheduler, das Threading mit der neuen [[Native POSIX Thread Library]] und den Netzwerk-Stack, der nun ebenfalls in den meisten Tests O(1) skaliert ist. Außerdem wurde für die Verwaltung der I/O-Gerätedateien das früher genutzte [[devfs]] durch das neuere [[udev]] ersetzt, was viele Unzulänglichkeiten, wie zum Beispiel ein zu großes ''/dev/''-Verzeichnis, beseitigt. Außerdem kann so eine einheitliche und konsistente Gerätebenennung erfolgen, die beständig bleibt, was vorher nicht der Fall war.

== Zukünftige Entwicklungen ==

=== Einheitliches WLAN-Subsystem ===
Jeff Garzik stellte Anfang 2006 fest, dass die Situation rund um WLAN-Treiber in Linux unausgegoren war: Die meisten Treiber bauten auf verschiedenen, nicht einheitlichen Systemen auf <ref name="garzik_2006">Jeff Garzik: ''[http://lkml.org/lkml/2006/1/5/671 State of the Union - Wireless]'' auf der Linux-Kernel E-Mailliste. 5. Januar 2006</ref>. Neue Treiber konnten damit nur schwer entwickelt werden, da schon zu Beginn unklar war, für welches Subsystem sie entwickelt werden sollten. Auch war das Warten verschiedener Subsysteme und alter Treiber schwierig und erforderte einen großen Zeitaufwand.
Um diesen Problemen zu begegnen, wurde ein Verwalter für das WLAN-Subsystem bestimmt, John W. Linville, der sich seitdem um die Entwicklung kümmert. Seitdem wird an einem einheitlichen Subsystem auf der Basis des ''Advanced Datapath Drivers'' gearbeitet, der von der Firma [[Devicescape]] für den Kernel 2.6 freigegeben wurde <ref name="devicescape">Pressemitteilung Devicescape: ''[http://www.devicescape.com/news/releases/release_05-01-06_opensource.php Devicescape releases WI-FI technology to Open Source community]'', 1. Mai 2006</ref>.

== Entwicklungsprozess ==

[[Bild:Linus_Torvalds.jpeg|thumb|Linus Torvalds 2004]]
Die Entwicklung von Linux liegt durch die [[GNU General Public License]] und durch ein sehr offenes Entwicklungsmodell nicht in der Hand von Einzelpersonen, Konzernen oder Ländern, sondern in der Hand einer weltweiten Gemeinschaft vieler Programmierer, die sich hauptsächlich über das Internet austauschen. In vielen [[Mailingliste]]n, aber auch in Foren und im Usenet besteht für jedermann die Möglichkeit, die Diskussionen über den Kernel zu verfolgen, sich daran zu beteiligen und auch aktive Beiträge zur Entwicklung zu leisten. Durch diese unkomplizierte Vorgehensweise ist eine schnelle und stetige Entwicklung gewährleistet, die auch die Möglichkeit mit sich bringt, dass jeder dem Kernel Fähigkeiten zukommen lassen kann, die er benötigt.

Eingegrenzt wird dies nur durch die Kontrolle von [[Linus Torvalds]] und einigen besonders verdienten Programmierern, die das letzte Wort über die Aufnahme von Verbesserungen und Patches in die offizielle Version haben. Manche Linux-Distributoren bauen auch eigene Funktionen in den Kernel ein, die im offiziellen Kernel (noch) nicht vorhanden sind.

=== Änderungen der Herkunftskontrolle ===
Der Entwicklungsprozess des Kernels selbst ist wie der Kernel ebenfalls immer weiterentwickelt worden. So führte der Rechtsprozess der [[SCO Group]] um angeblich illegal übertragenen Code in Linux zur Einführung eines „Linux Developer's Certificate of Origin“, das von Linus Torvalds und [[Andrew Morton]] bekanntgegeben wurde<ref>Pressemitteilung OSDL: ''[http://www.osdl.org/newsroom/press_releases/2004/2004_05_24_dco.html Developer's Certificate of Origin]'', 2004</ref>. Diese Änderung griff das Problem auf, dass nach dem bis dahin gültigen Modell des Linux-Entwicklungsprozesses die Herkunft einer Erweiterung oder Verbesserung des Kernels nicht nachvollzogen werden konnte.

{{Zitat-en|These days, most of the patches in the kernel don't actually get sent directly to me. That not just wouldn't scale, but the fact is, there's a lot of subsystems I have no clue about, and thus no way of judging how good the patch is. So I end up seeing mostly the maintainers of the subsystem, and when a bug happens, what I want to see is the maintainer name, not a random developer who I don't even know if he is active any more. So at least for me, the _chain_ is actually mostly more important than the actual originator.

There is also another issue, namely the fact than when I (or anybody else, for that matter) get an emailed patch, the only thing I can see directly is the sender information, and that's the part I trust. When Andrew sends me a patch, I trust it because it comes from him - even if the original author may be somebody I don't know. So the _path_ the patch came in through actually documents that chain of trust - we all tend to know the "next hop", but we do _not_ necessarily have direct knowledge of the full chain.

So what I'm suggesting is that we start "signing off" on patches, to show the path it has come through, and to document that chain of trust. It also allows middle parties to edit the patch without somehow "losing" their names - quite often the patch that reaches the final kernel is not exactly the same as the original one, as it has gone through a few layers of people.|Linus Torvalds|Linux-Kernel Archive<ref>Linux-Kernel Archive: ''[http://lkml.org/lkml/2004/05/23/10 <nowiki>[RFD]</nowiki> Explicitly documenting patch submission]'', 23. Mai 2004</ref>, 23. Mai 2004}}

=== Das Versionskontrollsystem git ===
Die Versionskontrolle des Kernels unterliegt dem Programm [[git]]. Dies wurde speziell für den Kernel entwickelt und auf dessen Bedürfnisse hin optimiert. Es wurde im April 2005 eingeführt, nachdem sich abgezeichnet hatte, dass das alte Versionskontrollsystem [[BitKeeper]] nicht mehr lange für die Kernelentwicklung genutzt werden konnte.

=== Lizenz ===
Die bei GPL-Software übliche Klausel, dass statt der Version 2 der GPL auch eine neuere Version verwendet werden kann, fehlt beim Linux-Kernel. Die Entscheidung, ob die im Juni 2007 erschienene Version 3 der Lizenz für Linux verwendet wird, ist damit prinzipiell nur mit Zustimmung aller Entwickler möglich. In einer Umfrage haben sich Torvalds und die meisten anderen Entwickler für die Beibehaltung der Version 2 der Lizenz ausgesprochen.

== Literatur ==
* Wolfgang Mauerer: ''Linux Kernelarchitektur''. Hanser Fachbuchverlag, November 2003, ISBN 3-446-22566-8
* Robert Love: ''Linux-Kernel-Handbuch''. Addison-Wesley, Juli 2005, ISBN 3-8273-2204-9

== Weblinks ==
{{Portal|Freie Software}}
* [http://www.kernel.org/ kernel.org] – Das Linux-Kernel-Archiv (englisch)
* [http://kerneltrap.org/ kerneltrap.org] – Informationen über aktuelle Entwicklungen im Kernel (englisch)
* [http://kernelnewbies.org/ kernelnewbies.org] – Infos für angehende Kernel-Programmierer (englisch)
* [http://kernelplanet.org/ kernelplanet.org] – Der offizielle Kernel-Entwicklerblog (englisch)
* [http://www.ibm.com/developerworks/linux/library/l-gperf.html?S_TACT=105AGX03&S_CMP=EDU Anatomy of the Linux kernel]

== Quellen ==
<references />

{{Lesenswert}}

[[Kategorie:Linux]]

[[da:Linux]]
[[en:Linux kernel]]
[[es:Linux (núcleo)]]
[[fr:Noyau Linux]]
[[it:Kernel Linux]]
[[ja:Linuxカーネル]]
[[csb:Linux (jądro)]]
[[nl:Linux-kernel]]
[[nn:Linuxkjernen]]
[[pl:Linux (jądro)]]
[[pt:Núcleo do Linux]]
[[ru:Linux (ядро)]]
[[scn:Kernel Linux]]
[[sv:Linuxkärnan]]
[[th:ลินุกซ์ เคอร์เนล]]
[[zh:Linux 内核]]

Version vom 23. Oktober 2007, 13:53 Uhr

Vorlage:Infobox Betriebssystem-Linux

Linux ist ein Betriebssystemkern (engl. Kernel), der im gleichnamigen und anderen Betriebssystemen zum Einsatz kommt.

Linux wurde ursprünglich 1991 vom Finnen Linus Torvalds, der auch heute noch die Entwicklung koordiniert, für die x86-Architektur geschrieben. Es steht unter der freien GNU General Public License (GPL).

Grundlegende Technologie

Aufgaben des Kernels

Der Kernel eines Betriebssystems bildet die hardwareabstrahierende Schicht (Hardware Abstraction Layer), d. h. er stellt der auf dieser Basis aufsetzenden Software eine einheitliche Schnittstelle (API) zur Verfügung, die unabhängig von der Rechnerarchitektur ist. Die Software kann so immer auf die Schnittstelle zugreifen und braucht die Hardware selbst, die sie nutzt, nicht genauer zu kennen. Linux ist dabei ein modularer monolithischer Betriebssystemkern und zuständig für Speicherverwaltung, Prozessverwaltung, Multitasking, Lastverteilung, Sicherheitserzwingung und Eingabe/Ausgabe-Operationen auf verschiedenen Geräten.

Siehe auch: Betriebssystemkern

Programmiersprache

Linux ist fast komplett in der Programmiersprache C geschrieben, wobei einige GNU-C-Erweiterungen benutzt werden. Eine Ausnahme bilden die architekturabhängigen Teile des Codes (im Verzeichnis arch innerhalb der Linux-Sourcen), wie z. B. der Beginn des Bootvorganges, die in Assemblersprache geschrieben sind.

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 Speicher 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, wo der BIOS-Bootloader erfolgreich war und 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 Kern und weiteren grundlegenden Programmen (die den Computer erst bedienbar machen) zusammen.

Siehe auch: Gerätenamen unter Linux, Network Block Device, Linux (Betriebssystem)

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.

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 (user mode), während der Kernel im Kernel-Modus (kernel mode) 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 so 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 etc.).

Abstraktionsschichten unter Linux
Abstraktionsschichten unter Linux
Fast vollständige Abstraktion unter Linux

Die Tatsache, dass Linux nicht auf einem Mikrokernel 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 Mikrokernel-Konzepte ein.

Portierbarkeit

Obwohl Linus Torvalds eigentlich nicht beabsichtigt hatte, einen portierbaren Kernel zu schreiben, hat sich Linux dank des GNU Compilers GCC doch in diese Richtung entwickelt. Es ist inzwischen mit eines der am häufigsten portierten Systeme (nur noch NetBSD läuft auf etwa gleich vielen Architekturen). Das Repertoire reicht dabei von eher selten anzutreffenden Betriebsumgebungen wie dem iPAQ-Handheld-Computer, Digitalkameras oder Großrechnern wie IBMs zSeries bis hin zu normalen Home-PCs.

Obwohl die Portierung auf die S/390 ursprünglich ein vom IBM-Management nicht genehmigtes Unterfangen war (siehe auch: Skunk Works), hat IBM wohl inzwischen Gefallen am Linux-System gefunden, und so soll auch die nächste IBM-Supercomputergeneration 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 jedem eine einfache Möglichkeit bietet, auf einem freien System freie Software laufen zu lassen.

Linux läuft gegenwärtig auf den folgenden Architekturen:

User Mode Linux

Ein besonderer Port ist das User Mode Linux (UML). Prinzipiell handelt es sich dabei um einen Port von Linux 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 „Sandkästen“ ähnlich den Virtual Machines von Java oder den Jails von FreeBSD möglich, in denen ein normaler Benutzer Root-Rechte haben kann, ohne dem tatsächlichen System schaden zu können.

µClinux

µClinux ist eine Linux-Variante für Computer ohne Memory Management Unit (MMU) und kommt vorwiegend auf Microcontrollern und eingebetteten Systemen zum Einsatz. Seit Linux-Version 2.6 ist µClinux Teil des Linux-Projektes.

ELKS

ELKS, das Embeddable Linux Kernel Subset ist eine Kernel-Untermenge die auf x86-kompatiblen 16bit Prozessoren (8086/80286) lauffähig ist.

Kernel-Versionen

Auf der Website kernel.org werden alle alten und neuen Kernel-Versionen archiviert. Die dort befindlichen Referenzkernel werden auch als Vanilla-Kernel bezeichnet (von umgangssprachlich engl. vanilla für Standard bzw. ohne Extras im Vergleich zu Distributionskernels). Auf diesem bauen die sogenannten Distributionskernel auf, die von den einzelnen Linux-Distributionen um weitere Funktionen ergänzt werden.

Versionsnummern-Schema

Die Versionen von Linux folgen dabei einem bestimmten Schema:

Die erste Ziffer wird nur bei grundlegenden Änderungen in der Systemarchitektur angehoben. Während der Entwicklung des 2.5er Kernels kam wegen der relativ grundlegenden Änderungen, verglichen mit dem 2.4er Kernel, die Diskussion unter den Kernel-Programmierern auf, den nächsten Produktionskernel als 3.0 zu deklarieren. Torvalds war aber aus verschiedenen Gründen dagegen, sodass der resultierende Kernel als 2.6 bezeichnet wurde.

Die zweite Ziffer gibt das jeweilige „Majorrelease“ an. Bisher wurden stabile Versionen (sogenannte Produktionskernel) von den Entwicklern stets durch gerade Ziffern wie 2.2, 2.4 und 2.6 gekennzeichnet, während die Testversionen (sogenannte Entwicklerkernel) immer ungerade Ziffern trugen, wie z. B. 2.3 und 2.5; diese Trennung ist aber seit Juli 2004 ausgesetzt, es gibt zur Zeit (2006) keinen Entwicklerkernel mit der Nummer 2.7, stattdessen werden die Änderungen laufend in die 2.6er-Serie eingearbeitet.

Zusätzlich bezeichnet eine dritte Zahl das „Minorrelease“, das die eigentliche Version kennzeichnet. Werden neue Funktionen hinzugefügt, steigt die dritte Zahl an. Der Kernel wird damit zum Beispiel mit einer Versionsnummer wie 2.6.7 bestimmt.

Um die Korrektur eines schwerwiegenden NFS-Fehlers schneller verbreiten zu können, wurde mit der Version 2.6.8.1 erstmals eine vierte Ziffer eingeführt. Seit März 2005 (Kernel 2.6.11) wird diese Nummerierung offiziell verwendet [1]. So ist es möglich, die Stabilität des Kernels trotz teilweise sehr schneller Veröffentlichungszyklen zu gewährleisten und Korrekturen von kritischen Fehlern innerhalb weniger Stunden in den offiziellen Kernel zu übernehmen – wobei sich die vierte Ziffer erhöht (z. B. von 2.6.11.1 auf 2.6.11.2). Die Minorreleasenummer, also die dritte Ziffer, wird hingegen nur bei Einführung neuer Funktionen hochgezählt.

Entwicklerversion

Neue Funktionen finden sich im sogenannten -mm Kernel des Kernelentwicklers Andrew Morton und werden anschließend in den Hauptzweig von Torvalds übernommen. Somit werden große Unterschiede zwischen Entwicklungs- und Produktionskernel und damit verbundene Portierungsprobleme zwischen den beiden Serien vermieden. Durch dieses Verfahren gibt es auch weniger Differenzen zwischen dem offiziellen Kernel und den Distributionskernel (früher wurden Features des Entwicklungszweiges von den Distributoren häufig in ihre eigenen Kernels rückintegriert). Allerdings litt 2004/2005 die Stabilität des 2.6er Kernels unter den häufig zu schnell übernommenen Änderungen. Ende Juli 2005 wurde deshalb ein neues Entwicklungsmodell beschlossen, das nach dem Erscheinen der Version 2.6.13 erstmals zur Anwendung kommt: Neuerungen werden nur noch in den ersten zwei Wochen der Kernelentwicklung angenommen, wobei anschließend eine Qualitätssicherung bis zum endgültigen Erscheinen der neuen Version erfolgt.

Pflege der Kernel-Versionen

Während Torvalds die neuesten Entwicklungsversionen 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, Marc-Christian Petersen (zuvor Alan Cox) für den Kernel 2.2, Willy Tarreau (zuvor Marcelo Tosatti) für den Kernel 2.4, Greg Kroah-Hartmann und Chris Wright für die aktuellen stabilen Kernel 2.6.x.y(-stable), Linus Torvalds für die aktuellen „normalen“ Kernel 2.6.x, und Andrew Morton für seinen experimentellen -mm-Zweig, basierend auf dem neuesten 2.6.x. Zusätzlich zu diesen offiziellen und über 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 enthalten, die noch nicht im offiziellen Kernel enthalten sind, von denen der Distributor aber glaubt, dass seine Kundschaft sie benötigen könnte und die notwendige Stabilität respektive Fehlerfreiheit dennoch gewährleistet ist.

Erscheinungstermine

Version Datum Anmerkung Aktuell
0.01 17. September 1991 Initial Public Release
0.02 5. Oktober 1991
1.0.0 13. März 1994
1.1.0 6. April 1994 Entwicklungsversion
1.2.0 7. März 1995
1.3.0 12. Juni 1995 Entwicklungsversion
2.0.0 9. Juni 1996 2.0.40
2.1.0 30. September 1996 Entwicklungsversion
2.2.0 26. Januar 1999 2.2.26
2.3.0 11. Mai 1999 Entwicklungsversion
2.4.0 4. Januar 2001 2.4.35.3
2.5.0 23. November 2001 Entwicklungsversion
2.6.0 18. Dezember 2003 2.6.23

Neuerungen im Kernel 2.6

Die Kernel-Reihe 2.6 wurde ab Dezember 2001 auf Basis des damaligen 2.4er Kernels entwickelt und wies umfangreiche Neuerungen auf. Für die Entwicklung war der neue Kernel-Code übersichtlicher und leichter zu pflegen, während Anwender durch die Überarbeitung der Scheduler und des I/O-Bereichs und von geringeren Latenzzeiten profitierten [2]. Dies wurde durch eine Reihe von Maßnahmen erreicht, die im Folgenden besprochen werden sollen:

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 Molnár für den 2.6er Kernel komplett neu konzipiert und implementiert hat.

Der O(1)-Scheduler erhielt seinen Namen, weil die relevanten Algorithmen, auf denen der Scheduler basiert, die Komplexität O(1) haben. Dies bedeutet, dass die vom Scheduler für eigene Aufgaben benötigte Prozessorzeit unabhängig von der Anzahl der verwalteten Prozesse bzw. Threads ist. Insbesondere wird etwa auf Durchsuchen aller Prozesse nach dem „besten“ etc. verzichtet.

Der O(1)-Scheduler arbeitet daher auch bei sehr vielen Prozessen überaus effizient und benötigt selbst 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. Wenn 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 in der Regel nur sehr wenig Rechenzeit, sind dafür aber sehr zeitkritisch (so will man z. B. nicht ewig auf eine Reaktion der grafischen Oberfläche warten). Der Scheduler besitzt ausgefeilte Heuristiken, um festzustellen, ob ein Prozess interaktiv ist oder die CPU eher lange belegt.

Gegenwärtig arbeiten mehrere Kernelprogrammierer 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 ab dem Kernel 2.6 von 100 Hz auf 1000 Hz erhöht, das heißt, die kürzestmögliche Länge einer Zeitscheibe beträgt nun eine Millisekunde. Auch hiervon profitieren besonders die interaktiven Prozesse, da sie früher „wieder an der Reihe sind“. Da dies aber zu einer erhöhten CPU-Last und somit zu einem größeren Stromverbrauch führt, entschied man sich, den Takt ab dem Kernel 2.6.13 auf 250 Hz voreinzustellen. Bei der Konfiguration des Kernels sind jedoch auch noch die Werte 100 Hz und 1000 Hz wählbar.

Eine weitere Stärke dieses Schedulers liegt im verbesserten Thread-Management und der besseren Unterstützung von symmetrischem Multiprocessing (SMP) und Hyper-Threading. Dies kommt vor allem hoch belasteten Servern zugute. In Testsituationen konnten unter diesem Scheduler 100.000 Threads gestartet 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 herwechseln zu lassen.

Mit der Kernelversion 2.6.23 wurde im Oktober 2007 der O(1)-Scheduler durch einen sog. Completely-Fair-Scheduler ersetzt, der ebenfalls von Ingo Molnár entwickelt wurde.

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-Modus Aufgaben ausführt, kann dieser Vorgang durch einen Prozess aus dem User-Modus unterbrochen werden. Der Kernel macht dann weiter, wenn der Usermodus-Prozess seine Timeslice aufgebraucht hat oder selbst einen Re-Schedule anfordert, also dem Scheduler mitteilt, dass er einen anderen Task ausführen kann. Dies funktioniert, bis auf einige Kernel-Funktionen, die atomar (nicht unterbrechbar) ablaufen müssen, sehr gut und kommt ebenfalls der Interaktivität zugute.

Zugriffskontrolllisten

Mit dem Kernel 2.6 werden für Linux erstmals Zugriffskontrolllisten (access control lists) nativ eingeführt. Diese sehr feinkörnige Rechteverwaltung ermöglicht es vor allem Systemadministratoren, die Rechte auf einem Dateisystem unabhängig vom Gruppen- und Nutzermodell zu gestalten und dabei faktisch beliebig viele spezielle Rechte pro Datei zu setzen. Die mangelnde Unterstützung von Zugriffskontrolllisten von Linux wurde vorher als massive Schwäche des Systems im Rahmen der Rechteverwaltung und der Möglichkeiten zur sicheren Konfiguration gesehen.

Die Unterstützung von Zugriffskontrolllisten funktioniert dabei mit den Dateisystemen ext2, ext3, jfs und XFS nativ.

Inotify

Mit dem Kernel 2.6.13 hält erstmals Inotify Einzug in den Kernel. Dies ermöglicht das permanente Überwachen von Dateien und Ordnern: Wird eines der überwachten Objekte geändert oder ein neues Objekt im Überwachungsraum erschaffen, gibt Inotify eine Meldung aus, die wiederum andere Programme zu definierten Tätigkeiten veranlassen kann. Dies ist insbesondere für Such- und Indexierungsmechanismen der Datenbestände von entscheidender Bedeutung, und ermöglicht erst den sinnvollen Einsatz von Desktop-Suchmaschinen wie Kat oder Beagle. Ohne eine solche Benachrichtigungsfunktion des Kernels müsste ein Prozess die zu überwachende Datei bzw. den zu überwachenden Ordner in bestimmten Zeitintervallen auf Änderungen überprüfen, was im Gegensatz zu Inotify zusätzliche Performance-Einbußen mit sich brächte.

Weitere wichtige Änderungen

Soweit es möglich ist, wird in Linux 2.6 die Maximalzahl für bestimmte Ressourcen angehoben. Die Anzahl von möglichen Benutzern und Gruppen wurde von 65.000 auf über 4 Milliarden erhöht, ebenso wie die Anzahl der Prozess-IDs (von 32.000 auf 1 Milliarde) und die Anzahl der Geräte (Major/Minor-Nummern). Weitere leistungssteigernde Maßnahmen betrafen die I/O-Scheduler, das Threading mit der neuen Native POSIX Thread Library und den Netzwerk-Stack, der nun ebenfalls in den meisten Tests O(1) skaliert ist. Außerdem wurde für die Verwaltung der I/O-Gerätedateien das früher genutzte devfs durch das neuere udev ersetzt, was viele Unzulänglichkeiten, wie zum Beispiel ein zu großes /dev/-Verzeichnis, beseitigt. Außerdem kann so eine einheitliche und konsistente Gerätebenennung erfolgen, die beständig bleibt, was vorher nicht der Fall war.

Zukünftige Entwicklungen

Einheitliches WLAN-Subsystem

Jeff Garzik stellte Anfang 2006 fest, dass die Situation rund um WLAN-Treiber in Linux unausgegoren war: Die meisten Treiber bauten auf verschiedenen, nicht einheitlichen Systemen auf [3]. Neue Treiber konnten damit nur schwer entwickelt werden, da schon zu Beginn unklar war, für welches Subsystem sie entwickelt werden sollten. Auch war das Warten verschiedener Subsysteme und alter Treiber schwierig und erforderte einen großen Zeitaufwand. Um diesen Problemen zu begegnen, wurde ein Verwalter für das WLAN-Subsystem bestimmt, John W. Linville, der sich seitdem um die Entwicklung kümmert. Seitdem wird an einem einheitlichen Subsystem auf der Basis des Advanced Datapath Drivers gearbeitet, der von der Firma Devicescape für den Kernel 2.6 freigegeben wurde [4].

Entwicklungsprozess

Linus Torvalds 2004

Die Entwicklung von Linux liegt durch die GNU General Public License und durch ein sehr offenes Entwicklungsmodell nicht in der Hand von Einzelpersonen, Konzernen oder Ländern, sondern in der Hand einer weltweiten Gemeinschaft vieler Programmierer, die sich hauptsächlich über das Internet austauschen. In vielen Mailinglisten, aber auch in Foren und im Usenet besteht für jedermann die Möglichkeit, die Diskussionen über den Kernel zu verfolgen, sich daran zu beteiligen und auch aktive Beiträge zur Entwicklung zu leisten. Durch diese unkomplizierte Vorgehensweise ist eine schnelle und stetige Entwicklung gewährleistet, die auch die Möglichkeit mit sich bringt, dass jeder dem Kernel Fähigkeiten zukommen lassen kann, die er benötigt.

Eingegrenzt wird dies nur durch die Kontrolle von Linus Torvalds und einigen besonders verdienten Programmierern, die das letzte Wort über die Aufnahme von Verbesserungen und Patches in die offizielle Version haben. Manche Linux-Distributoren bauen auch eigene Funktionen in den Kernel ein, die im offiziellen Kernel (noch) nicht vorhanden sind.

Änderungen der Herkunftskontrolle

Der Entwicklungsprozess des Kernels selbst ist wie der Kernel ebenfalls immer weiterentwickelt worden. So führte der Rechtsprozess der SCO Group um angeblich illegal übertragenen Code in Linux zur Einführung eines „Linux Developer's Certificate of Origin“, das von Linus Torvalds und Andrew Morton bekanntgegeben wurde[5]. Diese Änderung griff das Problem auf, dass nach dem bis dahin gültigen Modell des Linux-Entwicklungsprozesses die Herkunft einer Erweiterung oder Verbesserung des Kernels nicht nachvollzogen werden konnte.

“These days, most of the patches in the kernel don't actually get sent directly to me. That not just wouldn't scale, but the fact is, there's a lot of subsystems I have no clue about, and thus no way of judging how good the patch is. So I end up seeing mostly the maintainers of the subsystem, and when a bug happens, what I want to see is the maintainer name, not a random developer who I don't even know if he is active any more. So at least for me, the _chain_ is actually mostly more important than the actual originator.

There is also another issue, namely the fact than when I (or anybody else, for that matter) get an emailed patch, the only thing I can see directly is the sender information, and that's the part I trust. When Andrew sends me a patch, I trust it because it comes from him - even if the original author may be somebody I don't know. So the _path_ the patch came in through actually documents that chain of trust - we all tend to know the "next hop", but we do _not_ necessarily have direct knowledge of the full chain.

So what I'm suggesting is that we start "signing off" on patches, to show the path it has come through, and to document that chain of trust. It also allows middle parties to edit the patch without somehow "losing" their names - quite often the patch that reaches the final kernel is not exactly the same as the original one, as it has gone through a few layers of people.”

Linus Torvalds: Linux-Kernel Archive[6], 23. Mai 2004

Das Versionskontrollsystem git

Die Versionskontrolle des Kernels unterliegt dem Programm git. Dies wurde speziell für den Kernel entwickelt und auf dessen Bedürfnisse hin optimiert. Es wurde im April 2005 eingeführt, nachdem sich abgezeichnet hatte, dass das alte Versionskontrollsystem BitKeeper nicht mehr lange für die Kernelentwicklung genutzt werden konnte.

Lizenz

Die bei GPL-Software übliche Klausel, dass statt der Version 2 der GPL auch eine neuere Version verwendet werden kann, fehlt beim Linux-Kernel. Die Entscheidung, ob die im Juni 2007 erschienene Version 3 der Lizenz für Linux verwendet wird, ist damit prinzipiell nur mit Zustimmung aller Entwickler möglich. In einer Umfrage haben sich Torvalds und die meisten anderen Entwickler für die Beibehaltung der Version 2 der Lizenz ausgesprochen.

Literatur

  • Wolfgang Mauerer: Linux Kernelarchitektur. Hanser Fachbuchverlag, November 2003, ISBN 3-446-22566-8
  • Robert Love: Linux-Kernel-Handbuch. Addison-Wesley, Juli 2005, ISBN 3-8273-2204-9
Portal: Freie Software – Übersicht zu Wikipedia-Inhalten zum Thema Freie Software

Quellen

  1. Thorsten Leemhuis: Neue Kernel-Serie mit Linux 2.6.11.1 gestartet auf heise.de, 7. März 2005
  2. Dr. Oliver Diedrich: The Next Generation - Linux 2.6: Fit für die Zukunft in der c't 24/2003, Seite 194
  3. Jeff Garzik: State of the Union - Wireless auf der Linux-Kernel E-Mailliste. 5. Januar 2006
  4. Pressemitteilung Devicescape: Devicescape releases WI-FI technology to Open Source community, 1. Mai 2006
  5. Pressemitteilung OSDL: Developer's Certificate of Origin, 2004
  6. Linux-Kernel Archive: [RFD] Explicitly documenting patch submission, 23. Mai 2004