OS-Dev für Einsteiger — Änderungen 2908 → 2913

Zeile 89: Zeile 89:
 
==Der eigentliche Kernel==
 
==Der eigentliche Kernel==
 
Wenn Du bis hierhin gekommen bist, hast Du mittlerweile etwas, was sich Kernel nennt. In Wirklichkeit hast Du aber noch nicht besonders viel von den ganzen Funktionen, die ein [[Kernel]] bieten muss. Du hast die Initialisierung geschafft, bei der Du noch nicht besonders viel Auswahl hast. Richtig interessant wird es jetzt, denn jetzt kannst Du viele verschiedene Wege wählen, die eigentliche Funktionalität Deines Kernels umzusetzen.
 
Wenn Du bis hierhin gekommen bist, hast Du mittlerweile etwas, was sich Kernel nennt. In Wirklichkeit hast Du aber noch nicht besonders viel von den ganzen Funktionen, die ein [[Kernel]] bieten muss. Du hast die Initialisierung geschafft, bei der Du noch nicht besonders viel Auswahl hast. Richtig interessant wird es jetzt, denn jetzt kannst Du viele verschiedene Wege wählen, die eigentliche Funktionalität Deines Kernels umzusetzen.
 +
 +
===Architekturen===
 +
Unter der ''Architektur'' Deines Betriebssystem ist die Art und Weise zu verstehen, wie die Komponenten Deines Systems zusammenspielen. Bevor Du anfängst, Code für die eigentliche Funktionalität des Kernels zu schreiben, solltest Du Dir klar sein, in welche Richtung die Reise gehen soll.
 +
 +
* Die allerwichtigste Entscheidung, die das Aussehen Deines Betriebssystems am schwerwiegendsten beeinflussen wird, ist die Entscheidung zwischen [[Monolithischer Kernel|monolithischem Kernel]] (die Hardwaretreiber sind alle im Kernel) und [[Microkernel]] (der Kernel macht nur das notwendigste, Treiber sind eigenständige [[Userspace]]-Prozesse) - oder natürlich beliebiger Mischformen davon, z.B. ein modularisierter Monolith wie [[Linux]].
 +
* Besonders beim Microkernel ist eine zentrale Frage, wie die [[Interprozesskommunikation]] aussehen soll. Auch bei einem monolithischen Kernel ist es kein Fehler, sich diese Frage zu stellen, auch wenn sie eher nachrangig ist.
 +
* Wie soll die Schnittstelle der Programme zum Kernel aussehen? (z.B. [[Syscall|Syscalls]])
  
 
===Die Aufgaben des Kernels===
 
===Die Aufgaben des Kernels===
−
Was sind nun die Funktionen, die ein Kernel im Allgemeinen bietet?
+
Bevor Du Dir anschaust, welche Funktionen Dein Kernel bieten soll, versichere Dich, dass Du weißt, was ein [[Kernel]] überhaupt ist. Ja, klar, er ist der Kern des Betriebssystems. Und weiter? Seine zentrale Aufgabe ist es, die Ressourcen des Systems zu verwalten - z.B. den laufenden Programmen Speicher zuzuteilen.
 +
 
 +
Im Allgemeinen wird für Betriebssysteme im [[Protected Mode]] ein Modell verwendet, in dem der Kernel in [[Ring]] 0 (Kernel Mode) und alle Programme in Ring 3 (User Mode) laufen. Als grobe Richtung kannst Du Dir merken, dass der Kernel alles das ist, was in Ring 0 läuft. Wenn ein User-Mode-Programm Betriebssystemfunktionen benötigt (z.B. mehr Speicher), ruft es den Kernel auf.
 +
 
 +
Was sind nun also die Funktionen, die ein Kernel im Allgemeinen bietet?
  
 
* [[Speicherverwaltung]]: Programme und höchstwahrscheinlich auch der Kernel selbst müssen zur Laufzeit dynamisch Speicher reservieren können. Die Speicherverwaltung im Kernel arbeitet üblicherweise nicht mit beliebigen anforderbaren Größen, sondern mit Blöcken von 4 Kilobytes, sogenannten ''Speicherseiten'' (engl. ''Pages''). Man unterscheidet dabei zwischen physischer und [[Paging|virtueller]] Speicherverwaltung.
 
* [[Speicherverwaltung]]: Programme und höchstwahrscheinlich auch der Kernel selbst müssen zur Laufzeit dynamisch Speicher reservieren können. Die Speicherverwaltung im Kernel arbeitet üblicherweise nicht mit beliebigen anforderbaren Größen, sondern mit Blöcken von 4 Kilobytes, sogenannten ''Speicherseiten'' (engl. ''Pages''). Man unterscheidet dabei zwischen physischer und [[Paging|virtueller]] Speicherverwaltung.
Zeile 97: Zeile 108:
 
* [[Interprozesskommunikation]]: Je nach Architektur des Betriebssystem extrem wichtig bis erstmal völlig nebensächlich. Es geht dabei darum, dass zwei Programme Informationen austauschen können, z.B. durch Senden von Nachrichten oder Aufruf von Funktionen des anderen Programms.
 
* [[Interprozesskommunikation]]: Je nach Architektur des Betriebssystem extrem wichtig bis erstmal völlig nebensächlich. Es geht dabei darum, dass zwei Programme Informationen austauschen können, z.B. durch Senden von Nachrichten oder Aufruf von Funktionen des anderen Programms.
 
* [[Treiber|Hardwaretreiber]]: Jeder Kernel enthält auch Hardwaretreiber. Je nach Architektur gehören dabei alle, manche oder so gut wie keine Treiber zum Kernel.
 
* [[Treiber|Hardwaretreiber]]: Jeder Kernel enthält auch Hardwaretreiber. Je nach Architektur gehören dabei alle, manche oder so gut wie keine Treiber zum Kernel.
 +
* Den Bootprozess anstoßen. Nachdem der Kernel sich selbst initialisiert hat, lädt er in irgendeiner Form ein erstes Programm (unter Linux ''init'') und startet es.
  
−
===Architekturen===
+
Im Umkehrschluss gehören eine [[Shell]], [[GUI]] oder sonstige Anwendungsprogramme '''nicht''' in den Kernel! Eine Shell im Kernel ist vielleicht akzeptabel für eine frühe Testphase, um überhaupt einmal etwas laufen zu sehen, aber es ist auf Dauer kein tragfähiges Konzept. (Einer der Gründe dafür: Erinnerst Du Dich an den Absatz über die Ringe oben? Was im Kernel liegt, hat Kernel-Mode-Privilegien, und ein Grundsatz für sichere Software ist, nie Privilegien zu haben, die man nicht braucht)
−
Unter der ''Architektur'' Deines Betriebssystem ist die Art und Weise zu verstehen, wie die Komponenten Deines Systems zusammenspielen. Bevor Du anfängst, Code für die eigentliche Funktionalität des Kernels geht, solltest Du Dir klar sein, in welche Richtung die Reise gehen soll.
 
−
 
 
−
* Die allerwichtigste Entscheidung, die das Aussehen Deines Betriebssystems am schwerwiegendsten beeinflussen wird, ist die Entscheidung zwischen [[Monolithischer Kernel|monolithischem Kernel]] und [[Microkernel]] (oder natürlich beliebiger Mischformen davon, z.B. ein modularisierter Monolith wie Linux).
 
−
* Besonders beim Microkernel ist eine zentrale Frage, wie die [[Interprozesskommunikation]] aussehen soll. Auch bei einem monolithischen Kernel ist es kein Fehler, sich diese Frage zu stellen, auch wenn sie eher nachrangig ist.
 
−
* Wie soll die Schnittstelle der Programme zum Kernel aussehen?
 
  
 
[[Category:Tutorials]]
 
[[Category:Tutorials]]