Stefan Tappertzhofen, Informatikfacharbeit, Grundkurs (GK), 12. Jahrgangsstufe, Abgabetermin: 15. März 2002, Lehrer: Herr Warthmann Funktionen eines einfachen Betriebssystems, dargestellt an einem Beispiel eines selbst entwickelten Betriebssystem mit ausgewählten Funktionen (Überarbeitete Version vom 17.11.2002; Weitere Informationen hierzu in der Datei „readme.doc“) 2 Inhaltsverzeichnis Seite 3 1. Vorwort und Einführung 1.1. Definition eines Betriebssystems und einige Beispiele bekannter Systeme 1.2. Der Bootvorgang und der Bootsektor 1.3. Der Kernel als ein fundamentaler Bestandteil eines Betriebssystems 2. Zielsetzung und Eigenanteil 2.1. Die Realisierung des Bootsektors 2.2. Der Kernel mit einem eigenen Interrupt 2.3. Der Kommandozeileninterpreter 6 3. Dokumentation und Anwendungsmöglichkeiten 3.1. PC- und Systemstatus Abfrage und Informationen rund um das System 3.2. Sektoren schreiben, einlesen und als Mikroprogramm ausführen 3.3. Die Konzeption eigener Mikroprogramme mit Hilfe des Kernels 3.4. Das System beenden 8 4. Reflexion 4.1. Hindernisse und Probleme die bei der Entwicklung des Systems auftraten 4.2. Mögliche Erweiterungen am System 4.3. Schlusswort 11 5. Anhang 5.1. Literatur- und Quellenverzeichnis 5.2. Quelltexte 5.2.1. Bootsektor 5.2.2. Kernel 5.2.3. Shell 5.2.4. Beispielprogramm 5.3. Erklärung 5.4. Kopien aus Büchern 5.5. Disketten 5.5.1. System bzw. Bootdiskette mit dem lauffähigen Betriebssystem 5.5.2. Datendiskette 14 2 3 1. Vorwort und Einführung Betriebssysteme spielen im Umgang mit dem PC eine fundamentale Rolle. Trotzdem ist vielen PC Benutzern die Funktionsweise eines solchen Systems völlig unbekannt. Die Leistungen, die moderne Betriebssysteme heute vollbringen sind für den einfachen PC Nutzer schlichtweg unüberschaubar geworden. Ich versuche in meiner Facharbeit die Funktionsweise einfacher Betriebssysteme (um nicht den Rahmen der Facharbeit zu sprengen), dargestellt an einem Beispiel eines selbst entwickelten Betriebssystem mit ausgewählten Funktionen zu verdeutlichen. Dabei werde ich in vier Schritten vorgehen. Zum einen werde ich den Begriff des Betriebssystems erklären. Dies ist jedoch nicht so einfach. In der heutigen Zeit ist es schwierig bei Produkten wie Windows 2000 noch zwischen dem eigentlichen Betriebssystem und den mitgelieferten Anwendungsprogrammen zu unterscheiden. Aus diesem Grund lege ich meinen Schwerpunkt hauptsächlich auf „einfache Betriebssysteme“. Doch was ist ein „einfaches Betriebssystem“? Welchem Funktionsprinzip entspringt ein „einfaches Betriebssystem“ und gibt es überhaupt ein gewisses Prinzip, das alle System miteinander verbindet? Im zweiten Teil meiner Facharbeit werde ich genauer auf die Entwicklung meines Systems eingehen, welches ich komplett in Assembler programmiert habe um die Funktionsweise eines Betriebssystems zu erläutern. Die Dokumentation über mein Betriebssystem findet sich dann im dritten Teil. Ich werde hier auch etwas näher über verschiedene Funktionen (auf die ich später noch zu sprechen komme) des Kernels schreiben. Unter anderem zeige ich wie ein Anwender mit Hilfe des Kernels eigene Mikroprogramme entwickeln kann. Der vierte Teil meiner Facharbeit beinhaltet die Reflexion. Das Ziel meiner Reflexion soll die kritische Analyse meiner Arbeit, insbesondere der Programmierung sein. So werde ich unter anderem auf allgemeine und spezielle Probleme und mögliche Erweiterungen an meinem Betriebssystem eingehen. 1.1 Definition eines Betriebssystems und einige Beispiele bekannter Systeme Die Definition eines Betriebssystem ist nicht genau festgelegt. So beschäftigt sich Dr. Peter Schnupps „Standart Betriebssysteme“ (s. Quellen) im Grunde genommen die ganze Zeit mit der Klärung des Begriffs „Betriebssystem“. Laut der DIN Norm 44300 sind Betriebssysteme (engl. Operating System, kurz: OS) die „Programme eines digitalen Rechensystems, die zusammen mit den Eigenschaften der Rechenanlage die Basis der möglichen Betriebsarten des digitalen Rechensystems bilden und insbesondere die Abwicklung von Programmen steuern und überwachen“ (Schnupp, 1990, S. 16). 3 4 Bei modernen Betriebssystemen, wie zum Beispiel Microsoft Windows XP, ist die Funktionsweise um ein Vielfaches komplexer als die Funktionsweise von einfachen Systemen wie MS-DOS, da diese Betriebssysteme dem Benutzer eine Vielzahl von beigelieferten Programmen (Dienste) anbieten. Doch was ist ein einfaches Betriebssystem? Da es keine genauen Definitionen hierfür gibt und sich jeder selbst seine eigene Meinung über einfache Betriebssysteme bilden kann, kann man diese Frage auch nicht so leicht beantworten. Damit der Begriff (einfaches Betriebssystem) aber in meiner Facharbeit mehr Substanz gewinnt bezeichne ich ein Betriebssystem als einfach, wenn man das eigentliche System klar von den beigelieferten Anwendungsprogrammen oder Diensten (sofern vorhanden) abgrenzen kann. Bei Betriebssystemen mit einer grafischen Oberfläche ist dies zum Teil nicht mehr der Fall. Die grafische Oberfläche von Microsoft Windows 98 zum Beispiel ist sehr stark vom Microsoft Internet Explorer 4.x geprägt. Doch der Internet Explorer ist kein Bestandteil des Systems, sondern nur ein Anwendungsprogramm. Da die klare Trennung zwischen System und Anwendungsprogramm in diesem Beispiel nicht gegeben ist, bezeichne ich MS Windows 98 auch nicht als einfaches Betriebssystem. Nach meiner Meinung ist jedoch die angesprochene Trennung bei Microsoft DOS in gewisser Weise schon vorhanden. Dieses Betriebssystem läuft auch ohne die beigelieferten Dienste (im Gegensatz zu Windows). DOS könnte man also schon eher als einfach bezeichnen. Alle Betriebssysteme lassen sich aber im Prinzip auf ein bestimmtes Aufgabenmuster zurückführen., so verwalten sie die Nutzung von Hardwareressourcen wie den Arbeitsspeicher, Peripheriegeräte und den Prozessor (engl. Central Processing Unit, kurz CPU). Daneben sind Betriebssysteme auch der Ausgangspunkt, von dem aus Anwendungsprogramme aufgerufen werden und der PC konfiguriert werden kann. Das am meisten verbreitete Betriebssystem ist heute immer noch Microsoft DOS, auf welches Microsoft Windows 95, 98 und ME noch aufbauen. Daneben finden sich auch einige andere Systeme wie Mac-OS, Linux, BeeOS und Windows NT. (vgl. „Betriebssystem“, MS Encarta 99). 1.2 Der Bootvorgang und der Bootsektor Ich beschränke mich bei dem hier angesprochenen Bootvorgang nur auf den Bootvorgang einer bootfähigen Diskette, da der Bootvorgang einer Festplatte mitunter anders verlaufen kann. 4 5 Beim Starten des Computers wird zuerst das BIOS (engl. Basic Input/Output System, dt.: Basis Ein- und Ausgabesystem) geladen, welches die Hardware und das System überprüft. Nun folgt der Bootvorgang. Das BIOS lädt den ersten Sektor (den Bootsektor) der Diskette in die Speicherstelle 0000:7C00h. Der Bootsektor ist immer 512 Byte groß (ein Sektor ist standardmäßig 512 Byte groß). Die Aufgabe des Bootsektors besteht nun darin den Kernel, auf den ich später noch eingehen werde, und eventuell anschließend eine Benutzerumgebung (UI, User Interface) zu laden, die es dem Benutzer ermöglicht Befehle an das System zu senden (vgl. tecChannel, „Der Bootvorgang, 2002). Normalerweise initialisiert der Bootsektor auch das Dateisystem. So finden sich in solchen Bootsektoren auch Diskettenspezifische Eigenschaften, die später für das Dateisystem von großer Wichtigkeit sind. (vgl. Zimmermann, „Organisation der Diskette unter DOS“, 2002) Aus der Sicht des Entwicklers ist es wichtig den Bootsektor nicht größer als 512 Byte werden zu lassen. Außerdem darf man die sogenannte Bootsignatur nicht vergessen, die den Sektor erst für das BIOS zu einem richtigen bootfähigen Sektor macht. Als Bootsignatur bezeichnet man die letzten 2 Bytes des Bootsektors. Für den Fall, dass der Bootsektor weniger als 510 Byte groß ist lässt man ihn auf 510 Byte füllen, damit die letzten 2 Byte auf jeden Fall die Bootsignatur bilden. (vgl. Marjamäki, 2002) 1.3 Der Kernel als ein fundamentaler Bestandteil eines Betriebssystems Der Kernel (auch Betriebssystemkern genannt) enthält eine Reihe von Funktionen, mit denen ein Betriebssystem oder ein Anwendungsprogramm einen Computer steuern kann. Unter anderem verfügt der Kernel über Funktionen die Ein- und Ausgabe von Texten und Zeichen auf dem Bildschirm steuern. Diese Funktionen bezeichnet man als API (Application Program Interfaces, dt.: Anwendungsprogramm Schnittstelle). In modernen Systemen befindet sich der Kernel nicht in nur einer einzigen Datei, sondern kann in viele verschiedene Dateien unterteilt sein (vgl. R. Lee, Beitrag in einem Forum, 2002). Hardware u. virtuelle Hardware Programme (API) Betriebssystem (UI*) Benutzer *UI = User Interface, Benutzer Oberfläche Grober Aufbau eines einfachen Betriebssystems 5 6 Die Abbildung verdeutlicht den Aufbau eines einfachen Betriebssystems. Der Kernel dient dabei als Schnittstelle und Steuerungszentrale für die Programme, die über die API des Kernels arbeiten und somit auf die Hardware (und eventuelle virtuelle Hardware) zugreifen können. Über die UI (User Interface) kann der Benutzer das System steuern und das System wiederum übergibt den Benutzer über die UI Statuswerte oder Fehlermeldungen. 2. Zielsetzung und Eigenanteil Um die Funktionsweise eines Betriebssystems darzustellen habe ich ein eigenes kleines Betriebssystem entwickelt (genannt „FDOS“ – „Floppy Disk Operating System“). Ich setze voraus, dass der Leser eine ausreichende Grundkenntnis über Assembler und den Aufbau von Computern besitzt. Als Assembler nutze ich den NASM (The Netwide Assembler Project, siehe Quellen). Während der Entwicklung erwies sich dieser kostenlose Assembler als sehr nützlich für die Programmierung von Betriebssystemen, da die meisten Assembler Codes (TASM oder MASM) leicht an NASM angepasst werden konnten. Leider zeigte sich jedoch auch, dass NASM noch in der Entwicklung ist und deshalb noch einige kleine Fehler hat. 2.1 Die Realisierung des Bootsektors In meinem System besteht die Aufgabe des Bootsektors darin zuerst den Kernel (mit dem Interrupt 21h) und dann den Shell, die Eingabeaufforderung, in den Speicher zu laden. Der Kernel wird in das Segment 1000h und der Shell in das Segment 3000h geladen. Außerdem wird dem PC mitgeteilt, dass es sich beim Kernel nicht um ein normales Programm, sondern um einen Interrupt handelt der deshalb auch als solcher speziell geladen werden muss (der Kernel wird also nicht als Mikroprogramm ausgeführt sondern nur in den Speicher geladen und als Interrupt initialisiert). Dazu muss man zuerst einmal das Interrupt Flag (IF) löschen. Erst dann kann man den neuen Interrupt (Nummer 21h) in den Speicher laden. Danach muss das IF natürlich wieder gesetzt sein, sonst könnte man keine Interrupts mehr aufrufen. Da mein System nicht über ein Dateisystem verfügt und so den Kernel bzw. die Eingabeaufforderung nur über die Sektorennummern startet habe ich auch auf die Disketten- und Dateisystem spezifischen Eigenschaften verzichtet. Diese Daten sind für die Lauffähigkeit meines System unerheblich. 6 7 2.2 Der Kernel mit einem eigenen Interrupt Der in das Segment 1000h geladene Kernel beinhaltet die Funktionen des selbst geschriebenen Interrupts 21h. Unter anderem kann man mit den angebotenen Funktionen die Texteingabe und Textausgabe steuern oder Mikroprogramme ausführen. Um dem Kernel mitzuteilen, welche Funktion man ausführen will, muss man in das AH-Teilregister die Funktionsnummer schreiben. Über den Befehl INT 21h wird dann der Interrupt aufgerufen und die Funktion abgearbeitet. Rücksprünge im Assemblercode müssen bei der Entwicklung des Kernels durch den Befehl IRET ersetzt werden, um nach der Abarbeitung der Funktion auch zum Programm zurückspringen zu können. Der Kernel wurde so konzipiert, dass er sehr effektiv arbeitet und klein ist. So passt der gesamte Betriebssystemkern in 3 Sektoren (das entspricht etwa 1.536 KB). Zum Vergleich: der Shell, der im Prinzip nur die Funktionen des Kernels dem Benutzer über Eingabe- und Ausgabegeräte zur Verfügung stellt benötigt etwa 6 Sektoren (das entspricht etwa 3.072 KB). Dies liegt vor allem daran, das der Kernel keine Zeichenkette enthält, die sehr viel Speicherplatz benötigen. 2.3 Der Kommandozeileninterpreter Mithilfe der Eingabeaufforderung (Shell genannt) ist es dem Benutzer möglich Befehle an das Betriebssystem zu senden, die dann abgearbeitet werden. Unter anderem ist der Shell der Ausgangspunkt, von dem man aus eigene Mikroprogramme starten kann. Der Shell greift dabei auf Funktionen des Kernels zurück. Mein Kommandozeileninterpreter wurde so aufgebaut, dass er als zentrale Befehlseinheit (aus der Sicht des Benutzers) arbeiten kann. So dient er als Kommunikationsplattform zwischen PC und Anwender. In meinem System ist der Shell ein Bestandteil des Betriebssystems. Es gibt auch Betriebssystem, da ist die Benutzeroberfläche nicht mit dem Betriebssystem gleich zu setzen. Bei Linux kann man zum Beispiel verschiedene Benutzeroberflächen verwenden. 3. Dokumentation und Anwendungsmöglichkeiten In der Dokumentation lernen Sie die Befehle des Shells kennen. Daneben bietet diese Dokumentation auch eine Zusammenfassung der wichtigsten Kernel Funktionen, sowie eine Beschreibung, die Ihnen verdeutlicht, wie Sie eigene Mikroprogramme für das System entwickeln können. 7 8 3.1 PC- und Systemstatus Abfrage und Informationen rund um das System Über den Befehl help erhalten Sie eine kurze Übersicht über alle unterstützten Befehle. Geben Sie hierzu help ein (kleingeschrieben) und drücken Sie die Eingabetaste. Der Befehl cls leert den Bildschirm von allen Zeichen und verschafft so mehr Überblick. Um eine kurze Information über den PC- und Systemstatus abzufragen dient der Befehl status. Der Statusbildschirm enthält Informationen über den Arbeitsspeicher, den Prozessor und über den Modus indem FDOS läuft: „Protected Mode“ oder „Real Mode“. Ich werde auf die Unterschiede der beiden Modi nicht näher eingehen, sie seien hier nur der Vollständigkeit halber erwähnt. Der debug Befehl gibt die aktuellen Werte des AX-, BX-, CX-, DX- Registers sowie des Carry- und Zeroflags aus. 3.2 Sektoren schreiben, einlesen und als Mikroprogramm ausführen Die Befehle für das Schreiben, Lesen und Ausführen eines Sektors sind vom Aufbau her ähnlich. Mit dem Befehl write können Sie einen Sektoren schreiben. Nach der Eingabe des Befehls werden Sie nun aufgefordert den Sektor anzugeben, in den Sie schreiben wollen. Sie können z.B. Sektor 20 wählen. Danach können Sie den Text schreiben, der gespeichert werden soll. Die Eingabe können Sie mit der ESCAPE Taste beenden. Daraufhin wird der Text auf die Diskette geschrieben. Mit dem Befehl run können Sie einen Sektor als Mikroprogramm ausführen. Der Befehl view gibt den Inhalt eines gewählten Sektors auf dem Bildschirm aus. 3.3 Die Konzeption eigener Mikroprogramme mit Hilfe des Kernels Die Konzeption eigener Mikroprogramme setzt die Kenntnis über die APIFunktionen des Kernels voraus. Im weiteren Verlauf werde ich auf die wichtigsten API-Funktionen des Kernels eingehen. Eine Funktion rufen Sie in Assembler über folgenden Code auf: MOV AH, 0 INT 21h ; Hier die Funktionsnummer eintragen ; Aufruf des Interrupt 21h (Kernel API) Interrupt 21h Funktionsaufruf unter NASM Manche Funktionen fordern noch weitere Parameter an, die dann über die in dieser Dokumentation (oder im Quelltext) angegebenen (Teil-) Register übergeben werden. 8 9 Mikroprogramm beenden und zu FDOS zurückkehren Eingabe: Ausgabe: Beschreibung: Funktionsnummer (AH=) 0 Keine Diese Funktion beendet ein Mikroprogramm und kehrt zu FDOS zurück. Beispielcode: MOV AH, 0 INT 21h Null terminierten String eingeben Eingabe: Ausgabe: Beschreibung: Funktionsnummer (AH=) 3, DI = ZielString Zielstring Schreibt über die Tastatur einen String bis Enter oder Return gedrückt wird. Der String ist Null-Terminiert, d.h. als letztes Zeichen wird automatisch eine 0 geschrieben. Beispielcode: JMP SHORT Read ZielString TIMES 10 DB 0 Read: MOV AH, 3 MOV DI, ZielString INT 21h Null terminierten String ausgeben Eingabe: Ausgabe: Beschreibung: Funktionsnummer (AH=) 5, SI = AusgabeString Bildschirm Schreibt einen Null terminierten String auf den Bildschirm. Wenn der PC das Zeichen 0 erreicht hat bricht er die Funktion ab, ansonsten würde eine Endlosschleife entstehen. Beispielcode: JMP SHORT Write AusgabeString DB ’Hallo’,13,10,0 Write: MOV AH, 5 MOV SI, AusgabeString INT 21h WORD nach String konvertieren Eingabe: Ausgabe: Beschreibung: Funktionsnummer (AH=) 12, DI = ZielString, BX = WORD ZielString Wandelt ein WORD in einen String um. Ein WORD ist immer positiv. Beispielcode: MOV MOV MOV INT AH, 12 DI, ZielString BX, 1000 21h String nach WORD konvertieren Eingabe: Ausgabe: Beschreibung: Beispielcode: Funktionsnummer (AH=) 13, SI = EingabeString BX (Zahl) Wandelt einen String in ein Word um. MOV AH, 13 MOV SI, EingabeString INT 21h 9 10 Einen Sektor als Mikroprogramm ausführen Eingabe: Ausgabe: Beschreibung: Funktionsnummer (AH=) 22, ECX = Sektornummer keine Ein Sektor wird als Mikroprogramm ausgeführt und in das Segment 7000h geladen. Beispielcode: MOV XOR MOV INT AH, 22 ECX, ECX CX, 15 21h Die hier aufgelistete Übersicht zeigt einen Einblick in die Funktionen des Kernels. Alle weiteren Funktionen finden Sie im Quelltext des Kernels mit einer ausreichenden Beschreibung. Wir beschäftigen uns jetzt mit der Konzeption eines einfachen „Hello World“ Programms. Dieses kleine Mikroprogramm soll beim Aufruf eine Textmeldung ausgeben und sobald eine Taste gedrückt wurde sich beenden und zu FDOS zurückkehren. Die Programmierung läuft hierbei in vier Schritten ab. Als Erstes muss dem PC mitgeteilt werden, dass wir das Segment 7000h ausführen wollen. Man könnte dies als Initialisierung bezeichnen. Danach sollte der eigentliche Quellcode des Programms folgen. Mit Hilfe der Kernel Funktionen können wir die Textausgabe steuern und auf einen Tastendruck warten. Um das Programm zu beenden rufen wir die Funktion 0 des Interrupt 21h (Kernel). Als letztes muss nun nur noch der String als Variable erstellt werden, der ausgegeben werden soll. Den Quellcode des Beispielprogramms finden Sie auf der Diskette (vgl. „hello.asm“). Um das Programm nun zu kompilieren geben Sie bitte folgenden Befehl in die MS-DOS Eingabeaufforderung ein: nasm test.asm -f bin -o test.bin (mehr über die Optionen von NASM erfahren Sie in der auf der Diskette beiliegenden NASM-Dokumentation). Das Mikroprogramm soll nun in den Sektor 15 geschrieben werden. Legen Sie hierzu zuerst die FDOS-System Diskette ein und verwenden Sie dann folgenden Befehl, um den Sektor auf die Diskette zu schreiben: copyboot test.bin 15. Das Mikroprogramm sollte sich nun auf der Diskette im Sektor 15 befinden. Wenn Sie FDOS nun starten und über die FDOS-Eingabeaufforderung mit dem run Befehl den Sektor 15 ausführen sollten Sie auf dem Bildschirm nun die gewünschte Textmeldung lesen können. Drücken Sie eine Taste um zu FDOS zurück zukehren. 3.4 Das System beenden Um FDOS zu beenden geben Sie bitte den Befehl exit ein. Sie gelangen nun auf ein Menü mit 5 Auswahlmöglichkeiten. Drücken Sie die jeweilige Zahl, um das System mit der jeweiligen Option zu beenden. Wenn Sie FDOS einfach neu starten 10 11 möchten (Schnellstart) drücken Sie die Option 1. Das System wird nun neu gebootet. Daneben stehen Ihnen zwei weitere Neustart-Optionen offen: Kalt- und Warmstart. Bei beiden wird das BIOS neu geladen. Der Warmstart ist jedoch in der Regel etwas schneller. Die 4. Option ist nur für APM fähige Rechner sinnvoll. Wenn Sie die 4. Option auswählen und Ihr Rechner ein APM fähiger Rechner ist wird er komplett ausgeschaltet. Ob ihr Rechner APM fähig ist können Sie entweder bei den meisten Rechnern aus dem BIOS oder der Gebrauchsanweisung entnehmen. 4. Reflexion Das von mir entwickelte System erhebt natürlich nicht den Anspruch auf Vollständigkeit. Es verdeutlicht nur die Grundfunktionen. In diesem Kapitel will ich auf die Probleme eingehen, die sich bei der Entwicklung meines Systems ergaben. Daneben versuche ich das System kritisch zu betrachten, vor allem im Hinblick und auf eventuelle Erweiterungen. 4.1 Hindernisse und Probleme die bei der Entwicklung des Systems auftraten Da Assembler nicht die Möglichkeit eines Debuggers bietet und der Assembler Code mitunter sehr unübersichtlich werden kann, kann es leicht zu Fehlern kommen. Es ist sehr mühselig diese Fehler ausfindig zu machen. Schon kleine Veränderungen an bestimmten Teilregistern können zu unerwarteten Problemen führen. Außerdem könnte die Fehlerursache bei machen Problemen an Bugs (Fehlern) des NASM Assemblers und nicht an meinem Code liegen. Ursprünglich war eine Konfigurationsmöglichkeit geplant, mit der man den PC und das System konfigurieren kann. Ich hatte dabei einen Sektor als Konfigurationssektor reserviert, indem das System zum Beispiel Passwörter und Schriftgrößen speichern kann. Der Sektor wurde zwar korrekt eingelesen, doch er konnte nicht überschrieben werden, d.h. man konnte nicht die Konfigurationen ändern. Ferner sind manche Funktionen im Kernel nicht fehlerfrei. Unter anderem ist es nicht möglich in die ersten 10 Sektoren der Diskette zu schreiben, was jedoch den schönen Nebeneffekt hat, dass man das System, welches sich ja hauptsächlich in den ersten Sektoren befindet so nicht überschreiben kann. 4.2 Mögliche Erweiterungen am System Im Vergleich zu Systemen wie MS-DOS, die auch noch relativ einfach aufgebaut sind, stellt sich mein System als ein ziemlich unbrauchbares dar. Das wohl größte Manko ist das fehlende Dateisystem. Der Umgang mit 512 Byte großen Sektoren ist für den Nutzer alles andere als komfortabel. Programme 11 12 können z.B. nicht über ihren Dateinamen, sondern nur über eine Sektorennummer aufgerufen werden. Bei der Einbindung eines Dateisystems stellt sich jedoch die Frage, welches Dateisystem solle man denn nun verwenden. Die drei meist verbreiteten sind FAT (File Allocation Table), genutzt von MS Windows und DOS (FAT spaltet sich in FAT 12 für Disketten, FAT 16 für kleine Festplatten und FAT 32 für große Festplatten), NTFS (New Technology File System), genutzt von MS Windows NT und Windows 2000 und den Unix/Linux Systemen wie EXT/2. Jedes dieser Dateisysteme hat seine Vor- und seine Nachteile. FAT Systeme sind relativ einfach aufgebaut. Die Dateitabelle FAT, beinhaltet für jeden Sektor des Laufwerks den aktuellen Status. So könnte ein Sektor zum Beispiel den Status „Leer“ enthalten. Sollte die FAT zerstört sein, werden die gesamten Daten des Laufwerks unlesbar. (vgl. George, „Tell me about Filesystems“, 2002) Ein gutes Dateisystem erfordert jedoch auch ein gutes Speichermanagement. Im Grunde bietet mein System überhaupt kein Speichermanagement. Außerdem adressiert mein System 3 MB nur den Konventionellen Arbeitsspeicher (bis 640 KB). Der Erweiterungsspeicher (XMS) (2 MB) hohe Speicherbereich (bis 384 KB), der HMA Expansionsspeicher (EMS) (1 MB) Erweiterungsspeicher 1 MB (XMS) oder der 640 KB Expansionsspeicher (EMS) wird gar nicht angesprochen. Microsoft Hoher Speicherbereich (348 KB) Konventioneller Arbeitsspeicher (640 KB) „Speicherkonfiguration eines typischen Computers“ (MS-DOS Benutzerhandbuch, S. 128) MS-DOS benutzt verschiedene Speichermanager, wie z.B. Emm386 um auch den Speicher oberhalb von 640 KB zu nutzen. Der Hohe Speicherbereich wird hauptsächlich von der Hardware benutzt. Erweiterungsspeichermanager wie Himen verwalten den XMS (vgl. MS-DOS Benutzerhandbuch, S. 126 f.). Man kann schon erahnen, dass die Verwaltung des Speichers ein recht kompliziertes Verfahren ist. Der Einbau einer Fenstertechnik wäre erst sinnvoll, wenn mein System Multitasking unterstützen würde. Beim Multitasking ist es möglich mehrere Prozesse nebeneinander laufen zu lassen, es erfordert jedoch ein noch viel kompliziertes Speichermanagement. Außerdem lässt sich Multitasking und Fenstertechnik nur effizient in einer GUI (engl. Graphical User Interface, dt.: Grafische Benutzeroberfläche) einsetzten. 12 13 Die Entwicklung einer GUI ist jedoch nicht so einfach. Man würde schnell von Assembler zu sogenannten „Hochsprachen“ wie C, C++ oder auch Pascal übergehen, da sie die Programmierung vereinfachen (auf der anderen Seite aber auch nicht so schnelle, kleine und flüssige Programme wie Assembler erzeugen). Oft sieht man heute eine Kombination aus einer Hochsprache und Assembler. Dabei werden zum Beispiel bei Pascal oder C bestimmte Funktionen oder Befehle mit Assembler Code ergänzt (vgl. Rohde, S. 481 ff., 2001). 4.3 Schlusswort Allgemein kann ich jedoch von meinem System behaupten, dass es der Zielsetzung nahe kommt. Eigentlich hatte ich vor ein komplettes und einfaches System, möglichst ohne Bugs (Fehler) zu erstellen. Da jedoch wie schon erwähnt die Fehlersuche in Assembler sich als äußerst schwierig erweist und bei mehr als 1700 Zeilen Assembler Quelltext zu einem langwierigen Verfahren werden kann war es mir schlichtweg unmöglich alle Fehler zu beheben. Mein System jedenfalls ist lauffähig und wurde auf zwei Privat-Rechner, sowie auf einem Schulrechner getestet. Ich hoffe, dass ich dem interessierten Leser die Funktionsweise von Betriebssystemen etwas näher gebracht habe und durch mein eigenes System gezeigt habe, wie die Entwicklung eines Systems aussehen könnte. Viele Funktionen eines System konnte ich nur kurz erläutern. So ließe sich zum Beispiel. über Dateisysteme ganze Bücher schreiben. Das von mir erwünschte Thema („Funktionen eines einfachen Betriebssystems, dargestellt an einem Beispiel eines selbst entwickelten Betriebssystem mit ausgewählten Funktionen“) erwies sich als ein sehr komplexes Thema und bei der Bearbeitung der Facharbeit musste ich auf viele näheren Erläuterungen und Informationen verzichten, die sonst den Rahmen gesprengt hätten. Mein Ziel war es aber auch die Bedeutung von Betriebssystemen für den PC und für den Anwendung herauszustellen. Ich hoffe, dass ich diesem Ziel gerecht wurde. Stefan Tappertzhofen; Düsseldorf, den 14.03.2002 (Überarbeitete Version vom 17.11.2002; weitere Informationen zu den Änderungen enthält die Datei „readme.doc“) 13