Xairro.com

Login
Schliessen

Willkommen im Xairroversum! Ein kostenloser Account bei uns bietet dir mehrere Vorteile. Welche das genau sind, kannst du in der Tour erfahren. Viel Spaß!

Login

Register

Betriebssystementwicklung

In diesem Tutorial erkläre ich einiges zum Thema Betriebssystementwickelung. Ich beschränke mich auf die Entwickelung eines Kernels mit der Programmiersprache C (etwas anderes kann ich da beim besten Willen nicht empfehlen).

Voraussetzungen

Um ein Betriebssystem zu programmieren, benötigst du einige materielle/virtuelle Dinge, aber auch viele Kenntnisse und Erfahrung

  • Beherrschung der Programmiersprachen Assembler und C
  • Sehr tiefgreifende Kenntnisse über die genaue Funktionsweise des PCs (dieses Wissen wird einem beim lernen von Assembler vermittelt)
  • Viel Zeit und Geduld
  • Beherrschung deines Betriebssystems
  • Gutes Englisch
  • Ein (oder besser noch zwei, einen zum Testen, einen zum Programmieren) Computer
  • Windows oder besser Linux
  • Standardperepherie (Monitor, Maus, Tastatur...)
  • Diskettenlaufwerk
  • NASM (ein Assembler, Linux und Windows)
  • GCC für Linux, das Framework DJGPP für Windows (Compiler)
  • Bochs (ein Emulator, Linux und Windows)
  • RawWrite (nur, wenn du Windows hast)

Meiner Meinung nach ist es um einiges leichter, Linux zur Betriebssystementwickelung zu nutzen. Das bleibt aber jedem selbst überlassen. Vorteile von Linux sind: Fast alle Distributionen haben alle Programme schon an Board, auf Grund der Verwaltung von Geräten ist es um einiges leichter direkt auf das Device zu schreiben (ohne Beachtung des Dateisystems) und man kann virtuelle Floppys anlegen.

Getting started

Aller Anfang ist schwer... Das ist nicht richtig, der Anfang ist bei der Betriebssystementwickelung sogar ziemlich leicht.

Wie üblich wollen wir mit der Ausgabe eines Textes beginnen. Hierzu findest du bei Lowlevel, einer wichtigen Anlaufstelle zum OS-Development, ein kleines Tutorial: http://lowlevel.brainsware.org/wiki/index.php/Ausgabe_1#OS_Dev-Tutorial.2C_Teil_1

Für den Anfang ist es leichter, Assembler zu nutzen. Deine ersten Tests zu diesem Thema wirst du alle in Assembler schreiben.

Anlaufstellen

Ohne Informationsmaterial kommst du nicht weit, du musst dir bei der Betriebssystementwickelung wirklich vieles zusammensuchen. Gute Anlaufstellen sind da immer das deutschsprachige LowLevel mit einem Magazin und ein paar Tutorials. Hier kannst du gut anfangen. LowLevel bietet aber auch nur beschränkt Mateterial, irgendwann bist du auf mehr angewiesen. Da kann ich dir nur das englischsprachige BonaFide ans Herz legen.

Weg vom Assembler, OS-Development in C

Du merkst wahrscheinlich schon, wie kompliziert es ist, mit Assembler zu programmieren, da die Quelltexte schnell sehr lang und unübersichtlich werden. Du wünschst dir doch sicher eine Hochsprache wie C? Wenn du C Programmieren möchtest, musst du in einem anderen Prozessormodus programmieren, dem Protected Mode, nicht mehr im Real Mode. Das Problem ist nun, dass einiges getan werden muss, um in den Protected Mode zu springen. Hier habe ich ein paar Tutorials für dich:

Der Bootloader

Du hast bei der Betriebssystemprogrammierung verschiedene Möglichkeiten, einen Bootloader zu realiersieren, der so viel oder so wenig kann, wie du möchtest. Aber es gibt auch schon fertige Bootloader, die du nutzen kannst. Dies ist z.B. GRUB (siehe Wikipedia), ein sehr beliebter Bootloader.

Vorteile
Eigener Loader GRUB
  • sehr kompakt
  • keine überflüssigen Funktionen
  • sehr schnell
  • flexibel
  • bietet flexibles Menü an
  • User muss für weiteres OS nur Menüdatei anpassen
  • springt in den Protected Mode
  • kann Kernel von Dateisystem laden
Nachteile
Eigener Loader GRUB
  • User kann nicht den standardmäßigen Bootloader nutzen
  • groß
  • recht langsam

Das sind natürlich nicht alle Vor- und Nachteile, aber es sind Wichtige, die dir zur Orientierung dienen können. Ich persönlich bevorzuge Grub, u.A. weil ich faul bin, weil ich kompatibel zu anderen Betriebssystemen sein will und weil man mit GRUB beliebig viele Kernel auf einer Platte haben kann (da GRUB den Kernel vom Dateisystem laden kann). Du kannst hier selber frei entscheiden, wie es dir beliebt.

So kannst du GRUB unter Linux installieren:

  1. Erzeuge ein Dateisystem auf deiner Diskette (z.B. mit mkdosfs /dev/fd0).
  2. Mounte die Diskette irgendwo, z.B. unter /mnt.
  3. Kopiere die GRUB Images in das Verzeichnis /mnt/boot/grub. Nur stage1, stage2 und menu.lst sind notwendig. Die Datei *stage1_5 muss nicht unbedingt kopiert werden.
  4. Mounte die Diskette ab.
  5. Führe die folgenden Kommandos aus (beachte, dass sich die ausführbare Datei grub in Ihrem System in einem anderen Verzeichnis befinden kann, z.B. in /usr/sbin):
    1
    2
    3
    4
    5
    6
    /sbin/grub --batch --device-map=/dev/null <<EOF
    device (fd0) /dev/fd0
    root (fd0)
    setup (fd0)
    quit
    EOF
    

Für Windows musst du dir ein fertiges GRUB-Image herunterladen: http://download.xairro.com/osdev/GRUB-Empty-Floppyimage/

Ein GRUB-kompatibeler Kernel muss einen Multiboot-Header haben. Wie du diesen Programmieren kannst, kannst du hier erfahren.

Der Kernel

Ein vollständiger Betriebssystemkernel besteht aus folgenden Schichten (von unten nach oben):

  • Schnittstelle zur Hardware (Geräte, Speicher, Prozessoren)
  • Prozessverwaltung (auch Dispatcher genannt)
  • Speicherverwaltung (evtl. einschließlich virtuellem Hauptspeicher)
  • Prozessverwaltung (auch Scheduler genannt)
  • Geräteverwaltung (auch Device Management genannt)
  • Dateisysteme

Die Aufgaben des Kernels sind:

  • Schnittstelle zu Anwenderprogrammen (Starten, Beenden, Ein-/Ausgabe, Speicherzugriff)
  • Kontrolle des Zugriffs auf Prozessor, Geräte, Speicher (Scheduler, Gerätetreiber, Speicherschutz). Möglichst alleiniger Zugriff des Kernels auf diese Ressourcen.
  • Verteilung der Ressourcen, etwa der Prozessorzeit(en) (bzw. der Prozessoren) auf die Anwenderprogramme
  • Strukturierung der Ressourcen, etwa Abbildung von Dateisystemen auf blockorientierte Geräte wie Festplatten, Netzwerkprotokollstapel auf Netzwerkkarten.
  • Auflösung von Zugriffskonflikten, etwa Verriegelung bei Mehrprozessorsystemen, Warteschlangen bei knappen Ressourcen
  • Virtualisierung der Ressourcen (Prozessor: Prozesse, Festplatte: Dateien, Netzwerkkarte: z. B. Sockets, Speicher: virtueller Speicher, Geräte: Spezialdateien)
  • Überwachung von Zugriffsrechten auf Dateien und Geräte bei Mehrbenutzersystemen

Anmerkung: Die beiden Listen wurden aus der Wikipedia übernommen.

Ich empfehle dir, verschiedene Kernelansätze anzuschauen. Dies hilft oft ungemein um selber Dinge zu schaffen. Hier habe ich eine Liste mit ein paar Kernelansätzen für dich bereitgestellt:

Zu empfehlen ist das Buch Betriebssysteme: Eine Einführung von H.-J. Siegert und U. Baumgarten. Das im Oldenburg-Verlag erschienene Buch ist unter der ISBN 3-486-25714-5 erhältlich. In diesem Werk wird auf Konzepte der Betriebssystementwicklung eingegangen, es werden Dinge wie Interprozesskommunikation und Rechenkernverwaltung behandelt, es werden aber keine konkreten Implementierungsbeispiele und Tipps für die x86-Arichtektur oder einer anderen Bauweise vermittelt. Gut sind auch die Quellenangaben und Verweise auf andere Literatur. Das hinten im Buch angefügte Literaturverzeichnis alleine fasst 17 Seiten, hier findet man sicher noch einige vielversprechend klingende Titel. Ungewohnt ist für den Entwickler, der mit englischen Fachbegriffen aufgewachsen ist, die Verwendung der deutschen Entsprechungen, beispielsweise ist eine Exception ein Alarm und man spricht nicht von Interrupts, sondern von Unterbrechungen.

Der Rest des Betriebssystems

Ein Kernel ist aber noch lange kein Betriebssystem. Einiges fehlt noch, ob eine Shell oder Standardtreiber. Es gibt noch einiges zu tun.

Mach aber erstmal den Kernel fertig, dann können wir uns wieder sprechen. Du wirst wissen, was zu tun ist. Viel Erfolg!

0 comments

Sorry but there are no comments for this entry. What about writing the first one?

Post comment

Zum Kommentieren musst du angemeldet sein.

About the author

Max

Max - im Internet PowerProgrammer - ist ein Programmierer, der seit mehreren Jahren erfolgreich mit verschiedenen Programmiersprachen entwickelt. Er verfügt über tiefgehende Kenntnisse in diversen Bereichen und publiziert regelmäßig Artikel auf Xairro.com.

Weitere Informationen gibt es in seinem Userprofil auf Xairro und auf seiner privaten Homepage.

Tags

anderen assembler ausgabe betriebssystem bootloader buch dev device dinge eigener eines einiges etwa fd0 genannt geräte grub haben hier kannst kernel laden leichter linux loader lowlevel mode ohne paar programmieren protected protected-mode-tutorial ressourcen speicher tutorial tutorials vermittelt vorteile wissen zur