Kernel — Änderungen 6023 → 6658

Zeile 1: Zeile 1:
−
Der '''Kernel''', auch '''Betriebssystemkernel''' genannt, ist der zentraler Bestandteil und die Grundlage eines jeden [[Betriebssystem | Betriebssystems]]. Auf ihn bauen alle anderen Bestandteile des Betriebssystems wie Module, [[Treiber]] oder Anwendungen auf. Je nach Anwendungszweck wurden verschiedene Kernelarten mit individuellen Vor- und Nachteilen entwickelt. Ein bekannter Betriebssystemkernel ist der [[Linux|Linuxkernel]].
+
Der '''Kernel''', auch '''Betriebssystemkernel''' genannt, ist der zentraler Bestandteil und die Grundlage eines jeden [[Betriebssystem | Betriebssystems]]. Auf ihn bauen alle anderen Bestandteile des Betriebssystems wie Module, [[Treiber]] oder Anwendungen auf. Je nach Anwendungszweck wurden verschiedene Kernelarten mit individuellen Vor- und Nachteilen entwickelt.
 +
 
  
 
== Aufgaben eines Kernels ==
 
== Aufgaben eines Kernels ==
−
Ein Kernel hat meist folgenden Aufgaben:
+
Ein Kernel hat grundsätzlich folgende Basisaufgaben:
 +
 
 +
* [[Speicherverwaltung]]
 +
* [[Prozessverwaltung]]
 +
* [[Interprozesskommunikation]]
 +
* Geräte- und Hardwareverwaltung
 +
* Schnittstelle für [[Treiber]]
 +
* [[Syscall]]s für Anwendungsprogramme
 +
* [[Scheduling]]
 +
 
 +
Architekturabhängige Teile dieser Aufgaben werden normalerweise in einem [[Hardware Abstraction Layer]] mit einer klar definierten Schnittstelle gekapselt, um die Wiederverwendbarkeit anderer Komponenten zu erhöhen. Dazu zählen teilweise schon (kleine) Treiber, wie z.B.  bei [[x86]] bzw. [[x64]] für die [[PIT]], [[PIC]], [[Local APIC]] oder ähnlichem.
 +
 
 +
Je nach Kernelart kommt diesen Aufgaben mehr oder weniger Gewicht zu. Außerdem können z.B. folgende Aufgaben hinzukommen:
  
−
* Speicherverwaltung
 
−
* Prozessverwaltung
 
−
* Geräte- und Hardwareverwaltung (evtl. mit Hilfe einer [[HAL]])
 
−
* Schnittstelle für [[Treiber]] oder Anwendungsprogramme
 
 
* [[Dateisystem]]verwaltung
 
* [[Dateisystem]]verwaltung
 +
* ausgewählte weitere Treiber (z.B. Treiber zum Erkennen und Konfigurieren von [[PCI]]-Geräten) oder alle Treiber
  
 
== Kernelarten ==
 
== Kernelarten ==
−
Folgenden Kernelarten existieren:
+
Folgende Kernelarten existieren:
  
 
=== Monolithischer Kernel ===
 
=== Monolithischer Kernel ===
−
Als monolithischen Kernel bezeichnet man einen Betriebssystemkernel, der nicht nur die typischen Aufgaben eines solchen durchführt, sondern auch gleich Treiber für [[:Kategorie:Hardware | Hardware]] und andere Funktionen mit sich bringt.
+
Als monolithischen Kernel bezeichnet man einen Betriebssystemkernel, der nicht nur die typischen Aufgaben eines solchen durchführt, sondern auch gleich Treiber für alle [[:Kategorie:Hardware | Hardware]], das virtuelle Dateisystem, Dateisystemtreiber und vieles mehr. Diese Treiber können entweder fest in den Kernel einkompiliert sein oder zur Laufzeit ladbar sein, laufen aber immer im Kernelmode. Das Treiberinterface besteht somit aus normalen Funktionsaufrufen, was zu einem deutlichen Geschwindigkeitsvorteil führen soll. Jedoch ist ein solcher Kernel nicht nur unflexibler, sondern auch deutlich fehleranfälliger und abgestürzte Module führen meist zu einem Absturz des gesamten Systems. Interprozesskommunikation spielt in einem solchen Kernel anfangs sicherlich erstmal eine untergeordnete Rolle, da die ges. Funktionalität direkt über den Kernel erreichbar ist. Dies vereinfacht die Entwicklung und das
−
Dadurch müssen nicht erst Treiber oder Module nachgeladen werden und auch eine Schnittstelle ist nicht erforderlich, was einen deutlichen Geschwindigkeitsvorteil mit sich bringt. Jedoch ist ein solcher Kernel nicht nur unflexibler, sondern auch deutlich fehleranfälliger und abgestürzte Module können nicht ohne weiteres neu gestartet werden. Außerdem macht die fehlende Hardwareabstraktion den Kernel schwieriger zu entwickeln, wenn er nicht Mechanismen wie genormte Treiberinterfaces oder Ähnliches anbietet. Der Linuxkernel ist ein Monolithischer Kernel.
+
 
−
==== Diagramm zur Veranschaulichung ====
+
Das folgende Diagramm zeigt den groben Aufbau eines monolithischen Kernels:
−
Dieses Diagramm zeigt den groben Aufbau eines monolitschen Kernels.<br>
+
 
−
[[Bild:Makro kelin corr.png]]
+
 
 +
<center>[[Bild:Makro kelin corr.png]]</center>
 +
 
  
 
=== Mikrokernel ===
 
=== Mikrokernel ===
−
Der Mikrokernel steht im Gegensatz zum monolithischen Kernel, da bei ihm nur ein sehr kleiner Teil der Funktionalität wirklich im Kernelspace liegt. [[Treiber]], I/O und ähnliche Komponenten liegen als gesonderte Prozesse im Userspace und kommunizieren mit dem Kernel. Der Kernel verwaltet und verteilt also die Ressourcen, während die Userspaceprozesse sich um die konkrete Nutzung selbst kümmern. Somit kann ein fehlerhafter [[Treiber]] nicht das ganze [[Betriebssystem]] zum Absturz bringen und einfach neu gestartet werden. Außerdem kann der Kernel an sich leicht für unterschiedlichste Systeme portiert werden, da die systemabhängigen Treiber nicht im Kernel sind, und der Kernel vom Aufbau des Systems idealerweise nichts wissen muss. Der Kernel von [[Týndur]] ist ein Mikrokernel.
+
Bei einem Mikrokernel im Gegensatz zum monolithischen Kernel liegt nur die Implementierung der oben genannten Basisaufgaben im Kernelspace. [[Treiber]], Dateisystemverwaltung (eventuell inklusive virtuellem Dateisystem) und ähnliche Komponenten liegen als gesonderte Prozesse im Userspace und kommunizieren mit dem Kernel über [[Syscall]]s bzw. mit anderen Prozessen über [[Interprozesskommunikation]]. Der Kernel verwaltet und verteilt also nur die Ressourcen, während die Userspaceprozesse sich um die konkrete Nutzung selbst kümmern. Somit kann ein fehlerhafter [[Treiber]] nicht das ganze [[Betriebssystem]] zum Absturz bringen und eventuell neu gestartet werden. Letzteres funktioniert allerdings nur bei einem entsprechenden Design des Kernels, der Interprozesskommunikation und anderer Komponenten, da z.B. ein abstürzender Festplattentreiber, der die Betriebssystempartition verwaltet, nicht so ohne weiteres nachgeladen werden kann, sondern permanent im Speicher vorgehalten werden muss.
  
 
Prominenter Verfechter dieser Kernelart ist u.a. Andrew S. Tanenbaum, der dieses Prinip in [[Minix]] verwendet.
 
Prominenter Verfechter dieser Kernelart ist u.a. Andrew S. Tanenbaum, der dieses Prinip in [[Minix]] verwendet.
−
==== Diagramm zur Veranschaulichung ====
+
 
−
Dieses Diagramm zeigt den groben Aufbau eines Mikrokernels.<br>
+
Das folgende Diagramm zeigt den groben Aufbau eines Mikrokernels:
−
http://be59.be.funpic.de/Lowlevel/mikrokernel_klein.png
+
 
 +
 
 +
<center>http://be59.be.funpic.de/Lowlevel/mikrokernel_klein.png</center>
 +
 
 +
 
 
=== [[Exokernel]] ===
 
=== [[Exokernel]] ===
 
Der Exokernel ist eine Unterart des Mikrokernel. Bei ein Exokernel liegt die HAL in Biblitoheken, die vom Programm eingebunden werden können. Jedoch kann das Programm genau so gut selbst auf die Hardware zugreifen. Der Vorteil ist damit höhere Flexibilität für den Programmierer, und die bessere Möglichkeit, ein anderes System und dessen API durch eine spezielle Bibliothek zu emulieren.
 
Der Exokernel ist eine Unterart des Mikrokernel. Bei ein Exokernel liegt die HAL in Biblitoheken, die vom Programm eingebunden werden können. Jedoch kann das Programm genau so gut selbst auf die Hardware zugreifen. Der Vorteil ist damit höhere Flexibilität für den Programmierer, und die bessere Möglichkeit, ein anderes System und dessen API durch eine spezielle Bibliothek zu emulieren.