3.4 Das System beenden - Programmer`s Heaven User Uploaded

Werbung
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
Herunterladen