Gymnasium Marktoberdorf

Größe: px
Ab Seite anzeigen:

Download "Gymnasium Marktoberdorf"

Transkript

1 Gymnasium Marktoberdorf Abiturjahrgang 2006/08 FACHARBEIT Name des Verfassers: Leistungskurs: Kursleiter: Thema der Facharbeit: Stefan Linke Physik Betriebssystementwicklung Bewertung Datum:... Notenpunkte:... Note:... Unterschrift des Kursleiters:...

2 2 Inhaltsverzeichnis 1. 0B27BEinleitung B35BDefinition Betriebssystem B28BAufbau eines IBM-kompatiblen PCs B36BDer Prozessor B37BAufbau einer 32 Bit CPU B38BDer Arbeitsspeicher B39BDie restliche Hardware B29Bestandteile eines Betriebssystems B40BDer Bootloader B41BDer Kernel B42BDie Treiber B30BMein eigenes Betriebssystem (LivinOS) B43BAllgemeines B48BSystemvoraussetzungen B49BFeatures B4BVorüberlegungen B45BDer Startvorgang B46BDas A20 Gate B47BOptimierungen im Bootsektor B31BSchluss 13 B32BAnhang 13 23B50BScreenshots 14 24B51BMemory Map 16 6B3Quellen 16

3 3 1. 0B27BEinleitung Jeder der programmieren kann und sich mit Computern auskennt, spielt früher oder später auch einmal mit dem Gedanken, ein eigenes Betriebssystem zu entwickeln. Da viele aber nicht einmal eine Ahnung haben, wo man da anfangen kann, gibt es nur einige wenige, die so ein Projekt wirklich in die Tat umsetzen. Ich habe mir teilweise auch sehr schwer getan, aber nachdem ich die Grundlagen hatte, ging es recht zügig voran. Computer bestehen grundsätzlich aus 3 Komponenten: Hardware o Prozessor (CPU Central Processing Unit) o Arbeitsspeicher (RAM Random Access Memory) o Ein- und Ausgabegeräte Betriebssystem o Kontrolliert und koordiniert die Benutzung der Hardware von verschiedenen Anwendungen Anwendungen o Benutzen die vom Betriebssystem bereit gestellten Ressourcen um den Anforderungen der Benutzer gerecht zu werden o Bsp.: Textverarbeitungsprogramme, Web Browser, Datenbanksysteme, Compiler, Spiele 1.1 8B35BDefinition Betriebssystem Ein Betriebssystem ist die Hardware-nahe Softwareschicht zwischen Anwendungsprogrammen und dem Computer. Das Betriebssystem hat dabei die Aufgabe, Ressourcen, Speicher, Ein- und Ausgabe zu verwalten, sowie eine einfache Hardware-Schnittstelle für Anwendungen bereitzustellen. Es besteht in der Regel aus Treibern, einfachen Anwendungen, einem Kernel und einem Bootloader, dessen Aufgabe es ist, den Kernel zu laden. 2. 1B28BAufbau eines IBM kompatiblen PCs Ein IBM-kompatibler PC, also heutzutage eigentlich jeder normale Computer (Apple Produkte bilden da eine Ausnahme), verfügt über einen x86 oder einen x86-kompatiblen Prozessor (oft auch als Intel-kompatibel bezeichnet) B36BDer Prozessor IBM-kompatible PCs besitzen einen Prozessor mit der x86 oder einer dazu kompatiblen

4 F Befehlssatz F für F 4 Architektur. Die x86-architektur stammt von der Firma Intel und ist nach den Prozessoren der 8086-Reihe aus dem Jahre 1978 benannt. Im Weiteren werde ich mich nur auf die CPUs nach dem beschränken, da diese alten Modelle sowieso schon lang nicht mehr benutzt werden. Mit dem wurden bereits alle wichtigen Neuerungen in der Architektur, vor allem aber die 32 Bit Register, eingeführt. Außerdem gibt es seitdem einen fest in den Prozessor eingebauten mathematischen Coprozessor. Von diesem Zeitpunkt an ist die x86-architektur quasi Standard für PC-Prozessoren, da die meisten großen Hersteller wie Cyrix, NEC, UMC, IBM und natürlich AMD diesen Architektur-Standard 1 übernommen bzw. weiterentwickelt haben. Diese Prozessoren arbeiten mit einem CISCF 2 Befehlssatz, welcher im Gegensatz zum RISCF komplexere, aber dadurch auch leistungsfähigere Einzelbefehle verwendet B37BAufbau einer 32 Bit CPU Die 32 Bit x86 Prozessoren verfügen über 4 je 32 Bit breite Mehrzweck-Register, wobei das E jeweils für Extended steht: 3 EAX (engl.: Accumulator Register) wird in CF Rückgabewerte von Funktionen verwendet EBX (engl.: Base Register) ECX (engl.: Counter Register) meistens als Zähler verwendet EDX (engl.: Data Register) Diese Mehrzweck-Register (engl.: General Purpose Registers) sind vielseitig verwendbar. Des Weiteren gibt es: ESI (engl.: Source Index) EDI (engl.: Destination Index) EBP (engl.: Base Pointer) ESP (engl.: Stack Pointer) zeigt auf das aktuelle Element des Stacks, sollte nicht verändert werden wenn man nicht weiß was man tut Die Segment-Register: DS (engl.: Data Segment) CS (engl.: Code Segment) SS (engl.: Stack Segment) FS GS ES 1 Complex Instruction Set Computing komplexere Einzelbefehle, brauchen dafür mehr CPU-Zeit zum Ausführen 2 Reduced Instruction Set Computing reduzierter Befehlssatz, Einzelbefehle werden rel. schnell ausgeführt 3 Mit C ist hier die Programmiersprache gemeint

5 F (TR0-TR5 F an F an F an 5 Zusätzliche Spezial-Register: EIP (engl.: Instruction Pointer) zeigt auf den nächsten auszuführenden Befehl EFLAGS (engl.: Flag Register) die einzelnen Bits haben unterschiedliche Bedeutung und werden für bedingte Sprungbefehle eingesetzt 4 GDTR (engl.: Global Descriptor Table Register) gibt die Position der GDTF 5 LDTR (engl.: Local Descriptor Table Register) gibt die Position der LDTF 6 IDTR (engl.: Interrupt Descriptor Table Register) gibt die Position der IDTF CR0, CR1, CR2 und CR3 (engl.: Control Register) werden im Protected Mode zum Paging benutzt 7 TR6 TR7 (engl.: Test Register) zum Überprüfen des TLBF gibt es beim nicht) 8 DR0 DR7 (engl.: Debug Register) zum Setzen von BreakpointsF 9 TR (engl.: Task Register) Segment-Selektor des TSSF 2.3 1B38BDer Arbeitsspeicher Der Arbeitsspeicher (oder auch RAM) ist der flüchtige Hauptspeicher eines Computers. Alle Programme, werden ins RAM geladen bevor sie ausgeführt werden. Sonst befinden sich im Arbeitsspeicher noch alle möglichen (System-) Variablen, und auch einige Geräte werden darüber angesprochen, vor allem die Grafikkarte, da der Videospeicher in das RAM eingeblendet wird (siehe Anhang -> Memory Map) B39BDie restliche Hardware Die meisten Geräte des PCs werden über sogenannte Ports programmiert. Diese Ports haben nichts mit den Ports zum Internetzugriff zu tun! Sie sind eigentlich wie die Register der CPUs, allerdings sind sie nur ein Byte groß und werden nicht mit dem Befehl MOV angesprochen, sondern mit IN und OUT. 4 Global Descriptor Table wird nur im Protected Mode (PM) verwendet 5 Local Descriptor Table wird nur im PM verwendet 6 Interrupt Descriptor Table wird im PM zum Interrupt-Management verwendet 7 Translation Lookaside Buffer - 8 Breakpoints sind Unterbrechungsanweisungen für die CPU, wenn die CPU auf einen Breakpoint stößt unterbricht sie den Programmablauf 9 Task Status Segment wird im PM fürs Multi-Tasking verwendet

6 F in F oder B29Bestandteile eines Betriebssystems B40BDer Bootloader Der Bootloader ist der Teil des Betriebssystems, der gleich nach Anschalten es PCs als erstes gestartet wird. Er liegt im ersten Sektor einer Diskette oder einer Festplatte und wird 10 vom BIOSF den Arbeitsspeicher geladen und ausgeführt. Der Bootloader lädt und initialisiert daraufhin alle anderen Teile des Betriebssystems und startet am Ende den Kernel. Bekannte Bootloader sind zum Beispiel LILOF GRUBF F B41BDer Kernel Der Kernel ist der Hauptbestandteil jedes Betriebssystems. Alle anderen Bestandteile des Betriebssystems (ausgenommen ist der Bootloader), also Module, Treiber und Anwendungen bauen auf ihn auf. Er verwaltet den Speicher, die Ein- und Ausgabe, die Prozesse, das Dateisystem, sowie alle Geräte und Hardware. Zusätzlich hat er die Aufgabe dafür zu sorgen, dass sich die laufenden Programme (vor allem bei Multitasking Systemen) nicht in die Quere kommen, und dass die Hardware nicht mehrfach beziehungsweise fehlerhaft benutzt wird. Es gibt hauptsächlich 3 verschiedene Arten von Kerneln: Der Monolithische Kernel Der Monolithische Kernel ist der am weitesten verbreitete Kernel-Typ, er wird bzw. wurde zum Beispiel von Linux, MS-DOS, und allen Windows-Versionen von Windows 1.0 bis Windows ME verwendet. In einem monolithischen Kernel sind alle Treiber und Module direkt enthalten. Diese Tatsache macht ihn zwar auf der einen Seite fehleranfälliger (bei einem Fehler im Kernel der komplette Kernel beendet und der PC neu gestartet werden muss), aber auf der anderen Seite hat er dadurch, dass das Laden und das Kommunizieren mit den Modulen und Treibern wegfällt, einen spürbaren Geschwindigkeitsvorteil gegenüber einem Mikrokernel. Der Mikrokernel 10 Basic Input/Output System die Firmware eines Computers 11 Linux Loader Grand Unified Bootloader -

7 7 Der Mikrokernel hat normalerweise deutlich weniger Funktionen als ein Monolithischer Kernel. Treiber und weitere Funktionen werden über zusätzliche Module hinzugefügt, welche als eigene Prozesse laufen können und dadurch vom Kernel getrennt sind. Deswegen bringt ein Fehler in einem Treiber nicht das ganze Betriebssystem zum Absturz, da der betroffene Treiber einfach neu gestartet werden kann. Mikrokernel werden zum Beispiel bei SymbianOS (das Betriebssystem der Nokia-Handys), Mac OS X und bei allen Windows-Versionen ab Windows NT eingesetzt. Der Exokernel Ein Exokernel erlaubt den Anwendungsprogrammen direkteren Zugriff auf die Hardware und die Ressourcen als jeder andere Kernel. Ich werde hier nicht näher darauf eingehen, da diese Art von Kernel in der Praxis nicht eingesetzt wird. Der Hybrid- oder Makrokernel Der Hybridkernel ist ein Kompromiss zwischen Monolithischem Kernel und Mikrokernel. Es ist jedoch nicht genau definiert, welche Funktionen nun im Kernel sind und welche in Module ausgelagert werden. Dieser Kernel-Typ versucht die Vorteile beider Kernel-Arten zu vereinen B42BDie Treiber Treiber sind Programme/Module, welche Hardware-nahe Funktionen bereitstellen. In einem Monolithischen Kernel sind die Treiber Teil des Kernels, während sie in einem Mikrokernel beziehungsweise Exokernel eigenständige Module sind. Bei einem Betriebssystem mit Mikrokernel, wie zum Beispiel Windows XP, sind die Treiber die einzigen Hardware-abhängigen Bestandteile. Treiber müssen speziell auf die Hardware zugeschnitten sein, da es selbst bei Geräten, die eigentlich von der gleichen Art sind, große Unterschiede in der Funktionsweise beziehungsweise in der Kommunikation mit dem Gerät und der Programmierung gibt. 4. 3B30BMein eigenes Betriebssystem (LivinOS) B43BAllgemeines Ich habe das Betriebssystem auf einem alten PC (Pentium MMX 200 MHz) mit DeLi Linux unter einer spartanischen textbasierten Oberfläche entwickelt. Benötigt wird dazu außerdem ein C Compiler (gcc ist standardmäßig auf fast allen Linux Systemen 13 installiert) sowie ein Assembler, meine Wahl fiel da auf NASMF F. Getestet wurde es auf folgenden Systemen: 13 Netwide Assembler:

8 F auf 8 Intel Pentium MMX 133 MHz, 64 MB RAM Intel Pentium MMX 200 MHz, 128 MB RAM Intel Pentium 4 1,7 GHz, 1.0 GB RAM AMD Athlon XP 1,09 GHz, 1GB RAM Fujitsu Siemens Amilo Laptop mit Pentium 3 Prozessor und 512 MB RAM 14 Außerdem wurde es noch unter den Open Source Emulatoren BochsF F und getestet. 15 QemuF F B48BSystemvoraussetzungen Die Systemvoraussetzungen sind relativ gering, da keine grafische Oberfläche existiert, und das Betriebssystem mit knapp 22 kb hundertfach auf eine Diskette passen würde. Voraussetzung ist allerdings mindestens ein Prozessor und 32 MB RAM, obwohl es theoretisch ohne Probleme auch mit weniger RAM laufen sollte B49BFeatures Serielle Schnittstelle zum Debugging unterstützt Überprüfung des CMOSF Fehler VGA 80 x 25 Textmodus unterstützt AT/XT kompatible Tastaturen Mathematischer Coprozessor wird teilweise unterstützt Real Time Clock (Echtzeituhr) unterstützt Programmable Interval Timer (PIT) unterstützt CPU wird detektiert Diskettenunterstützung FAT12 Dateisystem (der Standard auf Disketten) DMA Unterstützung zum schnellen Diskettenzugriff Ausnahmefehlerbehandlung (siehe Anhang LivinOS Exception1) Protected Mode mit Speicherschutzmechanismen wird unterstützt Aktivieren des A20 Gates mit 6 verschiedenen Ansätzen => hohe Hardwarekompatibilität, sollte überall laufen B4BVorüberlegungen Will man ein Betriebssystem schreiben, sind zunächst Kenntnisse in Assembler nötig, da der Bootloader, sowie alle Hardware-Nahen Funktionen in Assembler geschrieben werden müssen. Außerdem sollte man überlegen, welchen Modus der CPU man verwenden möchte: Den Real Mode oder den Protected Mode (erst ab dem verfügbar). Jeder 14 Bochs Qemu Theoretisch, und zwar deshalb da ich kein geeignetes Kabel besitze und mich deswegen auf Tests mit Emulatoren beschränken musste; eine Debug-Software für einen Windows PC der an der anderen Seite des Kabels hängt, war auch in Entwicklung, ist aber aufgrund des Kabelmangels stehen geblieben 17 CMOS: der batteriegepufferte Speicher auf dem Mainboard in dem die BIOS Einstellungen gespeichert werden

9 F nur F des F können F große 9 Prozessor befindet sich wegen Kompatibilitätsgründen nach dem Starten im Real Mode. Der Protected Mode muss also extra aktiviert werden (siehe Protected Mode aktivieren). Beide Modi haben ihre Vorteile und sind unterschiedlich zu handhaben: Real Mode Beispiel für Betriebssysteme die im Real Mode arbeiten: MS-DOS Vorteile: 18 o BIOS-Funktionen in Form von InterruptsF verwendet werden => sehr kleiner Aufwand, da alle wichtigen Funktionen schon vorhanden sind (Bildschirmausgabe, Zugriff auf Geräte etc.) Nachteile: o Es sind nur die 16-Bit Register (AX, BX, CX, DX, SI, DI) verfügbar o Es muss komplett in Assembler geschrieben werden, da C-Compiler den 16 Bit Modus nicht unterstützen 19 o Segmentiertes Speichermodell: der Speicher ist in jeweils 64 kbf Segmente unterteilt, Speicherzugriffe finden in der Form Segment:Offset statt, was eine umständliche Art der Adressierung ist 20 o Es kann nur das erste MBF Arbeitsspeichers benutzt werden, was sich in Zeiten von Arbeitsspeichergrößen von 256 MB bis 4 GB ziemlich unvorteilhaft auswirken wird o Es existiert kein Zugriffsschutz, d. h. Programme könnten absichtlich oder durch einen Fehler im Programmcode Teile des Kernels überschreiben oder verändern, was unweigerlich zu einem Systemabsturz führen würde 21 o MultitaskingF mit immens großem Aufwand bzw. gar nicht realisierbar Protected Mode Die meisten modernen Betriebssysteme arbeiten im Protected Mode, unter anderem Windows (ab Windows 3.0), Linux, Mac OS X, ReactOS, SkyOS, Vorteile: o Verschiedene Schutzmechanismen (nur bei korrekter Anwendung des Protected Mode): Unterschiedliche Privilegstufen für Programme, Treiber und Kernel => Unterscheidung der Programme möglich Nicht jedes Programm darf jeden Befehl ausführen; Befehle, die 18 Interrupt kommt aus dem Englischen und bedeutet Unterbrechung ein Interrupt ist also eine Unterbrechung des aktuellen Programmcodes um eine andere Funktion auszuführen 19 kb => Kilobyte => 1 kb = 1024 Bytes 20 MB => Megabyte => 1024 kb => Bytes 21 Als Multitasking bezeichnet man das gleichzeitige Ausführen mehrerer Programme/Prozesse

10 10 hauptsächlich vom Kernel benutzt werden, um den Arbeitsablauf des Prozessors zu steuern, können für Anwendungsprogramme verboten werden Programme (außer dem Kernel) können nicht mehr in den Speicher anderer Programme schreiben o Ein Programmfehler (sofern nicht im Kernel) bringt nicht mehr zwangsläufig das komplette System zum Absturz o Erheblich bessere Voraussetzungen für Multitasking; hardwaremäßige Unterstützung ist vorhanden o Paging ist verfügbar, das heißt der Speicher kann in Pages unterteilt werden, welche auch zum Schutz verschiedener Speicherbereiche verwendet werden können; außerdem können so Speicherbereiche (Pages) auf die Festplatte ausgelagert werden, wodurch ein größerer Speicher emuliert werden kann o Arbeitsspeicher bis zu 4 GB ist adressierbar o 32 Bit Register sind verfügbar o Programme können in einer Hochsprache wie C oder PASCAL geschrieben werden Nachteile: o Kompliziertes Aktivieren und Verwenden des Protected Mode o A20 Gate muss aktiviert werden (siehe A20 Gate) o Funktionen zum Hardware Zugriff müssen alle selber geschrieben werden, da die BIOS-Interrupts nicht mehr verfügbar sind Aufgrund dieser Vorteile des Protected Mode und wegen der veralteten Technik des Real Mode habe ich mich dazu entschieden, mein Betriebssystem in den Protected Mode schalten zu lassen. Ich werde hier jedoch nicht weiter auf den Protected Mode eingehen, da alleine eine Beschreibung der Funktionen des Protected Mode den Rahmen dieser Facharbeit sprengen würde. Aus dem gleichen Grund werde ich im Folgenden nur auf einige wenige Module des Betriebssystems eingehen B45BDer Startvorgang LivinOS startet nur von der Diskette; es finden weder Lese- noch Schreibzugriffe auf die Festplatte statt. Nach Anschalten des Computers liest das BIOS den Bootsektor der Diskette in den Arbeitsspeicher und führt sodann den enthaltenen Code aus. In diesem Sektor (der auf einer üblichen 3.5 Zoll High Density Diskette 512 Bytes groß ist) befindet sich der erste Teil des Bootloaders. Dieser lädt den zweiten Teil des Bootloaders zusammen mit dem Kernel in den Speicher und führt diesen wiederum aus. Der Bootloader ist aus diesem Grund in zwei Teile zerteilt, weil sich mit 512 Bytes an Code eben nicht sonderlich viel anstellen lässt. Es mussten für diesen ersten Teil schon extreme

11 F und 11 Optimierungen und Kürzungen vorgenommen werden um das zu realisieren (mehr dazu in 4.4 Optimierungen im Bootsektor). Im zweiten Teil wird das A20 Gate aktiviert, und der Prozessor wird in den Protected Mode geschaltet. Nach diesem Schritt werden im nächsten Teil des Kernels zusätzliche Strukturen für weitere Mechanismen und Funktionen des Protected Mode initialisiert und aktiviert. Mit dem Protected Mode kann auch die 32 Bit Technologie verwendet werden und somit ist es möglich den Kernel in C zu schreiben. 22 Nach den darauffolgenden Initialisierungen der restlichen Hardware (RTCF F, COMF F-Ports, Grafikkarte, FPUF F, PITF F, CPU, und FDCF F) wird die Diskette 27 gemountedf letztendlich die Kommandozeile gestartet B46BDas A20 Gate Der 8086 hatte 20 Adressleitungen (20 Bits), über die ein Arbeitsspeicher von maximal 1 MB angesprochen werden konnte, wie oben bereits erwähnt. Da die Register, die man verwenden konnte (es gab damals nur den Real Mode) nur 16 Bit groß waren, musste man einen Weg finden, um trotzdem die vollen 20 Adressleitungen und damit das ganze erste Megabyte ausnutzen zu können. Aus diesem Grund wurde das Segment-Offset System entwickelt. Mit dem wurde eine 21. Adressleitung eingeführt, daher stammt auch der Name A20 da die Leitungen von A0 bis A20 durchnummeriert waren. Auf dem älteren Modell wurden allerdings alle Speicher Adressierungen, die über 1 MB hinausgingen, auf den Speicher an die Stelle (Adresse - 1 MB) zurück. Dieser Speicherumlauf wird im Protected Mode allerdings nicht mehr gebraucht. Er ist eher hinderlich, weil mit den damals neueren CPUs auf einmal aufgrund der 32 Bit breiten Register ein viel größerer Speicherbereich angesprochen werden konnte. Folglich wurde ein spezieller Chip eingebaut, welcher im Übrigen meistens in der Tastatur sitzt, der dieses Verhalten deaktivieren konnte. Aus Gründen der Abwärtskompatibilität aber ist das A20 Gate beim Starten selbst bei den aktuellsten Prozessoren immer noch deaktiviert und man muss den umständlichen Weg gehen, um es anzuschalten. Umständlich deswegen, weil das A20 Gate auf jedem Rechner gerne anders aktiviert werden möchte und dabei circa 10 verschiedene Möglichkeiten bestehen. Die Varianten sind dann teilweise auch noch untereinander inkompatibel, dass heißt, es funktioniert auf einem System nur mit dieser einen Möglichkeit, auf einem anderen wird mit dieser Art der Aktivierung hingegen die Grafikkarte deaktiviert (die Aktivierung des A20 Gates findet in der Datei LivinOS Sources\kernel\kernel16.asm statt) B47BOptimierungen im Bootsektor Da, wie bereits erwähnt, der Platz für ausführbaren Code im Bootsektor ziemlich klein ist 22 Real Time Clock Echtzeituhr auf dem Motherboard 23 Communication Equipment die serielle Schnittstelle RS Floating Point Unit mathematischer Coprozessor, welcher Gleitkommaoperationen erheblich schneller ausführt als der normale Prozessor 25 Programmable Interval Timer Timerchip, der in regelmäßigen Abständen ein Signal senden kann 26 Floppy Disk Controller Diskettenlaufwerkscontroller zum Ansprechen der Diskettenlaufwerke 27 Mount = einhängen, das Dateisystem wird eingelesen damit ein Zugriff stattfinden kann

12 F benötigt F AX, F genau F benützt, F bzw. F für F braucht 12 (auf einer 1.44 MB Diskette hat ein Sektor 512 Bytes, davon müssen noch die Daten für das Dateisystem sowie die Bootsignatur 0xAA55 am Ende des Bootsektor abgezogen werden => = 448, es bleiben also 448 Bytes für den Bootloader), musste erstens der Bootloader in zwei Teile aufgeteilt werden, und zweitens der erste Teil noch extrem optimiert werden. Im Folgenden werden einige der Optimierungen aufgezeigt (der Code für den Bootloader befindet sich im Anhang): Entfernen der Statusmeldungen sowie der Lade Nachricht: Das Laden des Kernels geht so schnell, dass man eventuelle Nachrichten gar nicht zu sehen bekommt. Die einzige verbliebene Nachricht ist die Fehlermeldung Kernel not found, welche angezeigt wird, wenn sich der Kernel (die Datei livinos.bin) nicht auf der Diskette befindet und somit nicht geladen werden kann 28 Verwenden von alternativen BefehlenF F: o Zum Setzen eines Registers auf 0 verwendet man normalerweise 29 MOV AX, 0 F F, dieser Befehl belegt 3 Bytes. Hingegen bewirkt der Befehl 30 XOR AX, AX F das gleiche, benötigt allerdings nur 2 Bytes. Diese Funktion, ein Register auf 0 zu Setzen, wird sehr oft verwendet, wodurch man einige Bytes einsparen kann. o Um zu/von einem Register den Wert 2 zu addieren/subtrahieren wird der Befehl ADDF 2 / SUB AX, 2 F welcher 4 Bytes benötigt Ein zweimaliges Verwenden von INC AX F DEC AX F hingegen nur 2 Bytes. 35 o PUSHA F zum Sichern aller Register nur 1 Byte, während das 36 Sichern mehrerer Register mit je einem PUSH <register> F jedes Register ein Byte benötigt; analog dazu das Wiederherstellen der Register mit POPA bzw POP <register> Das Sichern der Register in aufgerufenen Funktionen kann in einigen Funktionen entfernt werden, da nach dem Aufruf der Funktion keine Registerwerte mehr verwendet werden müssen, welche vor dem Funktionsaufruf im Register standen Mehrere Überprüfungen beim Lesen der Datei können weggelassen werden, da einer der wichtigsten Teile des Dateisystems direkt im Bootloader-Code vorhanden ist, und daher keine anderen Werte annehmen kann 28 Die Größen der Befehle in assemblierter Form (Maschinensprache) habe ich aus dem IA-32 Intel Architecture Software Developers Manual Volume 2A: Instruction Set Reference, A-M und dem IA-32 Intel Architecture Software Developers Manual Volume 2A: Instruction Set Reference, N-Z 29 MOV <register>, <wert> kopiert die Zahl <wert> in das Register <register> 30 XOR <wert1>,<wert2> - führt ein Exklusives Oder zwischen <wert1> und <wert2> durch, da in obigem Fall die Operanden aber gleich sind ist das Ergebnis 0 31 ADD <register>,<wert> addiert zum Register <register> den Wert <wert> 32 SUB <register>, <wert> subtrahiert <wert> vom Register <register> 33 INC <register> - erhöht das Register <register> um eins 34 DEC <register> - verringert das Register <register> um eins 35 PUSHA sichert alle Register auf dem Stack 36 PUSH <register> - sichert ein Register auf dem Stack

13 13 Die Kerneldatei kann nur einen fest im Bootloader einkompilierten Namen haben (livinos.bin) 5. 4B31BSchluss Ein Betriebssystem zu entwickeln ist wirklich nicht einfach. Als Voraussetzung muss man Assembler können, Spaß am Programmieren, Interesse an Computern und natürlich viel Zeit und Geduld haben. Viele der Leute, die ein eigenes Betriebssystem schreiben wollen, scheitern bereits ganz am Anfang, wodurch man natürlich das Interesse an diesem Themengebiet verliert. Man muss bereit sein, viel neues Wissen aufzunehmen und zu verstehen, dass heißt vor allem: viele Dokumentationen und Tutorials lesen, und nicht so schnell aufgeben. Außerdem ist ein gutes Verständnis der englischen Sprache Pflicht, da fast alle Informationen zu diesem Thema nur in Englisch vorhanden sind. Die einzige deutsche Community zur Betriebssystementwicklung (oder zum OSdev, wie es in der Szene genannt 37 wird), die ich gefunden habe, ist LowLevelF F. Ansonsten bleibt noch anzumerken, dass man nie den Status von Microsoft erreichen wird, und normalerweise auch kein Geld damit machen kann. B32BAnhang 37 Forum auf Wiki: und der dazugehörige Chat im EUIRC im Channel #lost

14 14 23B50BScreenshots LivinOS Bootloader 1 LivinOS Startvorgang 1

15 15 LivinOS Startvorgang 2 LivinOS Ausnahmefehler 1

16 16 24B51BMemory Map Die Belegung des Arbeitsspeichers, mit LivinOS gekennzeichnete Einträge sind Teile meines Betriebssystems): Offset (hexadezimal) Länge (in Bytes) Beschreibung 0x Interrupt Vector Table im Real Mode, gibt die Adressen der BIOS Funktionen an 0x Bios Data Area BIOS Einstellungen und Daten zum PC 0x (4096 * 4) Buffer für DMA Transfers (LivinOS) 0x00007C Bootsektor (LivinOS) 0x Kernel (LivinOS) 0x Page Directory für Protected Mode benötigt (LivinOS) 0x (4096 * 8) Page Tables für Protected Mode benötigt (LivinOS) 0x0009FC Extended Bios Data Area 0x000A VGA Puffer 0x000C Video BIOS 0x000F Motherboard BIOS 0xFEC BIOS, PnP, NVRAM, ACPI, etc. 6B3Quellen Die verwendeten Quellen und Dokumente sind gesammelt auf unter zu bekommen Eine ausführbare Version des Betriebssystems ist auf meiner Webseite erhätlich. Bis jetzt sind nur ein paar Befehle zu Demonstrationsund Testzwecken vorhanden (time, uptime, restart, memtest und exceptiontest). 26B53BInternetquellen (Auszug) IA-32 Architecture CPUID: HUhttp:// Microsoft Official FAT12/16/32 Specification (Microsoft): HUhttp:// Floppy Controller: HUhttp:// und HUhttp:// Bkerndev - Bran's Kernel Development (HUBrandon FriesenUH): HUhttp:// A20 - a pain from the past (unbekannter Autor): Außerdem die Lowlevel Magazine 1-7 bzw. das Lowlevel Forum (HUhttp://lowlevel.brainsware.org/forum/UH) und das Lowlevel Wiki (HUhttp://lowlevel.brainsware.org/wiki/index.php/HauptseiteUH) an dem ich auch selbst mitarbeite.

17 Dieser Text ist urheberrechtlich geschützt, alle Rechte liegen beim Autor, Stefan Linke. 17