Axel Rogat
Betriebssysteme und betriebssystemnahes Programmieren
 
1.2: Historisches Kapitel 1 2.1: Von-Neumann-Architektur 
 
  1.3 Beispiele für Betriebssysteme  
 

Wir werden uns im weiteren auf drei Betriebssysteme stützen, wenn es darum geht, die praktische Verwirklichung der besprochenen Konzepte zu untersuchen: MS-DOS, Windows und vor allem UNIX. Alle drei sind auf Intel-PC-kompatiblen Rechnern verfügbar und verbreitet (UNIX vor allem in Form des frei vertreibbaren Linux).

1.3.1 MS-DOS

Der Name DOS für Disk Operating System mag zwar ein wenig altertümlich klingen, trifft den Kern des Systems aber recht gut. Es handelte sich ursprünglich hauptsächlich um eine Sammlung von Routinen zum Laden und Speichern von Daten auf Disketten und zum Starten von Programmen.

MS-DOS und Windows sind gute Beispiele für Betriebssysteme, die nicht systemunabhängig definiert sind, und die ursprünglich fest für eine wesentlich andere Hardware entworfen wurden als die, auf der sie mittlerweile laufen müssen. Sie sind im Lauf der Jahre natürlich gewachsen und haben eine große Zahl seltsamer Hilfskonstruktionen hervorgebracht, um immer noch zu ihren Ursprüngen kompatibel zu sein.

Ein kurzer Überblick über die Geschichte von MS-DOS:

vor 1980
Viele Mikrocomputer für den Heimgebrauch basieren auf dem 8-Bit-Mikroprozessor 8080 von Intel. (Einer der ersten war übrigens der Altair (1975) mit 256 Bytes Hauptspeicher, für den Bill Gates einen BASIC-Interpreter schrieb.) Auf einem Großteil dieser Modelle lief das Betriebssystem CP/M von Digital Research.

1980
IBM plant einen 16-Bit-Mikrocomputer mit dem 8086 als Mikroprozessor. CP/M-86 hat arge Entwicklungsschwierigkeiten, und so kommt man über die Lizensierung seines BASIC-Interpreters mit Bill Gates' neugegründetem Unternehmen Microsoft weiter ins Geschäft und gibt ein einfaches und kompaktes Betriebssystem in Auftrag.

Microsoft kauft ein bereits fast fertiges Projekt namens 86-DOS (von Seattle Computer Products, Programmierer Jim Paterson), das sich stark an CP/M anlehnt, und auf das CP/M-Programme vergleichsweise leicht portierbar sind. Von CP/M her kommen beispielsweise die Dateinamen im Format 8+3 Zeichen, ausführbare (nicht relozierbare) Programme mit der Endung .COM ("Command") und die Laufwerksbezeichnungen A: etc.

Nur ein 160 KByte-Laufwerk für 5¼''-Disketten wird unterstützt. Das Dateisystem hat nur eine Ebene - es gibt also keine Verzeichnisse und Unterverzeichnisse.

1981
Im August kommt zusammen mit dem IBM PC das weiterentwickelte unter dem Namen MS-DOS 1.0 auf den Markt. Es ist 12 KByte groß und aus 4000 Assembler-Zeilen entstanden.

1982
Die Version MS-DOS 1.1 erscheint im Oktober.

Es werden logische Geräte wie CON, PRN und AUX eingeführt, die wie Dateien behandelt werden können, aber einen Geräte-Treiber und letztlich ein I/O-Gerät ansprechen.

Es sollen zwar nicht mehrere Programme gleichzeitig ablauffähig sein, aber doch gleichzeitig im Speicher liegen können (nachgeladene Treiber, residente Programme, etc.). Da das mit den alten .COM-Dateien nicht möglich war, wird das neue Format .EXE eingeführt.

Aufgrund der damaligen Speicherknappheit wird das System aufgesplittet in einen residenten Teil, der nach dem Booten permanent im Speicher verbleibt, und transiente Teile, die nur bei Bedarf nachgeladen und wieder entfernt werden können. Dazu gehören der Befehlszeilen-Interpreter und Befehle wie FORMAT, CHKDSK, etc.

Auf Wunsch von IBM wird eine Art Batch-Verarbeitung in Form der .BAT-Dateien eingebaut. Dennoch ist das Dateisystem immer noch flach.

1983
IBM kündigt den XT an, der standardmäßig mit einer Festplatte ausgestattet ist (10MB). Das flache Dateisystem ist dadurch nicht mehr haltbar, und MS-DOS 2.0 erhält ein hierarchisches Dateisystem, das stark an UNIX angelehnt ist. Viele Systemaufrufe werden von UNIX übernommen. Unter anderem, um nach außen DOS von UNIX abzugrenzen, wird als Trennsymbol in Dateipfaden absichtlich der Backslash `\' statt des Slash `/' von UNIX eingeführt.

Nachladbare Gerätetreiber (wie ANSI.SYS) werden endgültig Bestandteil des Systems. Einfaches Spooling (Ausdrucken im Hintergrund) wird möglich - allerdings jeweils nur in dem Zeitraum, wo das Vordergrund-Programm auf ein I/O-Ergebnis warten muß.

1984
IBM kündigt den AT mit dem 80286 an. Der Prozessor bietet Hardware-Unterstützung für 16 MByte Hauptspeicher und Multitasking, wovon Microsoft in der neuen MS-DOS-Version aber keinen Gebrauch macht. MS-D0S 3.0 unterstützt lediglich HD-Disketten, größere Festplatten und ist ein wenig schneller.

1987+
In der Folgezeit erscheinen Versionen bis MS-DOS 3.3 (1987), 4.0 (1988), 5.0 (1991) und 6.0 (1993), die an der Systemstruktur nichts mehr verändern. Das System wird nur erweitert um rudimentäre Netzwerk-Unterstützung (z.B. gemeinsam benutzte Files), Unterstützung neuerer Floppies, größerer Harddisks, etc.

Besonders begehrt sind diverse Hilfskonstruktionen zur Umgehung des unsäglichen Speicherengpasses. Erst die 1991 erscheinende Version 5.0 macht - 7 Jahre nach Erscheinen des 80286 - einigermaßen Gebrauch von mehr als 1 MByte Speicher.

1.3.2 Windows

Microsoft Windows in den Versionen 1.0 bis 3.11 (also nicht NT und vor Windows 95) war kein eigentliches Betriebssystem, sondern ein "Aufsatz" auf MS-DOS, eine grafische "Betriebsumgebung".

Die eigentlichen Elemente wie Fenster, Icons, Menüs etc. sind natürlich keine Microsoft-Entwicklung. Eine Fenster-Schnittstelle war schon 1981 bei Xerox entwickelt worden (im Palo Alto Research Center, PARC). Windows war in wesentlichen Teilen von der Oberfläche abgeschaut, die Apple bereits auf seinen Lisa- (1983) und Macintosh-Rechnern (1984) implementiert hatte.

Auf Prozeß-Ebene bietet Windows sogenanntes kooperatives Multitasking. Es können zwar gleichzeitig mehrere Prozesse im Speicher liegen - die CPU wird jedoch nicht vom System auf sie verteilt. Ein Prozeß muß freiwillig explizit die CPU-Kontrolle aufgeben, bis ein anderer an die Reihe kommt.

Die Kommunikation von Anwenderprogrammen mit dem Fenstersystem erfolgt über eine API (Application Program(ming) Interface), also eine Sammlung von Funktionen in Form von Bibliotheken, die normal wie Unterprogramme aufgerufen werden.

Ein kurzer Überblick über die Geschichte von Windows:

1983
Als Antwort auf Apple's Lisa kündigt Microsoft eine fenster-orientierte Benutzeroberfläche für PCs an.

1985
Windows erscheint im November, gleich mit der Versionsnummer 1.1. Es ist aber ein dilettantischer Abklatsch der Apple-Oberfläche. Fenster dürfen einander nicht überlappen, sondern müssen vollständig nebeneinander oder übereinander liegen.

1987
Windows 2.0 erscheint mit überarbeitetem "Look and Feel". Inwzischen ist OS/2 als geplanter Nachfolger von MS-DOS erschienen, seine grafische Oberfläche, der "Presentation Manager" ist aber noch nicht fertig. Die neue Windows-Obefläche lehnt sich schon einmal an den PM an, um später einen leichten Übergang zu OS/2 zu ermöglichen.

1988
Windows 2.1 erscheint in den beiden Versionen Windows/286 und Windows/386. In der 386-Version können mehrere DOS-Anwendungen sicher in virtuellen Maschinen laufen.

1990
Microsoft überläßt IBM die Weiterentwicklung von OS/2 und baut Elemente des OS/2 Presentation Managers nun in sein eigenes Produkt ein. Windows 3.0 verschmilzt wieder die 286- und 386-Versionen. Es ist das erste Windows, das als Plattform für sinnvolle größere Anwenderprogramme dienen kann. Es kann ein Arbeitsspeicher von 16 MB angesprochen werden. Man kann zwischen mehreren DOS- und Windows-Anwendungen umschalten. Programm- und Filemanager entstehen. Windows-Anwendungen älterer Versionen führen nun allerdings regelmäßig zum Absturz.

1991
Windows 3.1 unterstützt nur noch Prozessoren vom 80286 aufwärts. Wichtigste Neuerungen sind TrueType-Fonts und OLE (Object Linking and Embedding, zur Ressourcen-Teilung zwischen mehreren Programmen).

Windows NT ist das "High-End"-System von Microsoft (NT="New Technology"). Es ist nicht allein auf Intel-80x86-Prozessoren festgelegt und im wesentlichen nicht für Normalbenutzer, sondern für Serversysteme und Netzwerke gedacht. Entsprechend versucht es, besonderen Wert auf Sicherheitskonzepte zu legen.

Mit NT wird das sehr umfangreiche 32-Bit-API Win32 eingeführt, das ausschließlich für 32-Bit-Programme gedacht ist. Später gibt Microsoft die stark abgespeckte Version Win32s für Windows 3.1 heraus.

1995
Windows 95 läuft nur noch im erweiterten Modus, also auf Systemen mit 80386 aufwärts. Es unterstützt einen Großteil von Win32 (manchmal als Win32c bezeichnet).

1998
Windows 98 erscheint als kostenpflichtiges Bugfix von Windows 95.

1.3.3 UNIX

Hier sind viele der noch zu besprechenden Konzepte relativ vollständig verwirklicht. Die meisten der komplexeren Beispiele werden sich daher unter UNIX abspielen.

Außerdem steht mit Linux eine "Version" von UNIX jedem Besitzer eines PC-kompatiblen Rechners (ab 80386) frei zur Verfügung. Es bezeichnet sich selbst nicht als ein UNIX, deckt aber fast alle Spezifikationen von POSIX und UNIX System V. Es ist ein komplett neu geschriebenes System, für das kein Code anderer Versionen übernommen wurde.

Ein wesentlicher Vorteil von Linux ist in unserem Zusammenhang, daß es vollständig im Quellcode (C, ein wenig Assembler) vorliegt. Wir wollen aber nur diese Implementation studieren und nicht Änderungen am Kern vornehmen und das System neu übersetzen.

Linux gibt es mittlerweile auf diversen anderen Rechnerarchitekturen als Intel-x86. Wir werden auch nur selten auf prozessorabhängige Gegebenheiten eingehen müssen.

Ein kurzer Überblick über die Geschichte von UNIX:

1963
Das MIT (Massachusetts Institute of Technology), Packard Bell und GE (General Electrics) kündigen einen Rechner zusammen mit einem Betriebssystem an, das Hunderte oder Tausende von Benutzern bedienen können soll. Der Name des Systems ist MULTICS (MULTiplexed Information and Computing Service). Die Entwickler sehen den Rechner als Analogon eines E-Werks, und jeder Einwohner soll nur den Stecker in die Wand stecken müssen... Der Rechner soll modular fast unbegrenzt ausbaubar sein, und Teile sollen abgeschaltet und gewartet werden können, ohne die Funktionsfähigkeit des Systems zu beeinträchtigen. Es gibt leider herbe Entwicklungsschwierigkeiten. Man verspricht sich von PL/I Vorteile gegenüber FORTRAN und beginnt, das System in dieser Sprache zu schreiben - allerdings verspätet sich der PL/I-Compiler immer wieder und ist schließlich sehr fehlerhaft. Außerdem stimmt einfach das Verhältnis der geplanten Benutzer-Anzahl mit der tatsächlichen Hardware nicht.

MULTICS führt deshalb wichtige Konzepte ein, läuft aber erst 1969 halbwegs brauchbar nur auf einigen Laborrechnern (GE645) beim MIT. Die Bell Laboratories steigen ganz aus der Entwicklung aus. MULTICS wird nie kommerziell eingesetzt.

1969
Zwei der MULTICS-Entwickler, Ken Thompson und Dennis Ritchie, sollen bei den Bell-Laboratories ein verbessertes Dateisystem für die GE645 entwickeln. Auf diesem Rechner entsteht als Nebeneffekt aber schon ein kleiner Systemkern.

Als Thompson eine unbenutzte PDP-7 findet, portiert er Kernel und Dateisystem auf diesen Rechner (in Assembler). Das Dateisystem entspricht bereits ziemlich genau dem heutigen, mit hierarchischer Directory-Struktur in einem einheitlichen Dateibaum.

Es entsteht ein System, das zunächst nur für einen Benutzer gedacht ist. Brian Kernighan nennt das Gebilde daher scherzhaft UNICS (U für Uniplexed).

1971
Das System wird auf die größere PDP-11 portiert (Daten: 16 KB System, 8 KB Platz für Benutzerprogramme, 512 KB Plattenkapazität, maximale Dateilänge 64 KB).

Erste Compiler sollen auf dem System entstehen. Thompson konnte sich mit FORTRAN nicht anfreunden und entwickelt die Sprache B (angelehnt an das schon existierende BCPL=binary coded programming language, eine Abart von CPL). In B gab es als einzigen Datentyp Integer (und eine Art typlosen Pointer). Dennis Ritchie erweitert die Sprache um Datenstrukturen und einiges mehr und nennt sie C.

1973
Fast das ganze System wird in C umgeschrieben (bis auf sehr kurze maschinennahe Teile in Assembler). Dadurch wird es zwar minimal größer und langsamer als die Assembler-Vorgänger - dafür ist nun die Voraussetzung für die schnelle Weiterentwicklung und die Verbreitung auf andere Rechnersysteme geschaffen.

UNIX wird zum ersten Mal von anderen Benutzern als Thompson und Ritchie eingesetzt (25 Leute bei den Bell Laboratories).

Da AT&T selbst kommerziell keine Rechner oder Software vertreiben darf (Monopol-Aufsicht), wird die UNIX-Lizenz sehr günstig an viele Universitäten in den USA vergeben. Da dort viele PDP-11 verwendet werden, kann sich das System sehr schnell verbreiten. Viele neue Ideen können schnell in das System integriert werden, was vor allem dadurch begünstigt wird, daß der komplette Sourcecode zur Verfügung steht. Um diese Zeit entsteht das Text-Formatierungsprogramm troff (zunächst roff), das (bis zum Durchbruch von TeX der Standard für Textverarbeitung unter UNIX ist.

1977
UNIX wird zum ersten Mal auf einen Rechner außerhalb der PDP-Serie portiert (Interdata 8/32). Einige rechnerabhängige Parameter (16-Bit-Integers, Registeranzahl) waren an diversen Stellen hardcodiert worden, so daß einige Bereinigungsarbeit nötig ist.

Steve Johnson entwickelt den " portable C compiler", der so angepaßt werden kann, daß er Maschinencode für einen fast beliebigen Rechner produzieren kann. Er erleichert das Portieren auf weitere Architekturen erheblich.

Der erzeugte Code muß jeweils auf Bändern auf den anderen Rechner transportiert werden. In dieser Zeit entstehen daher auch rudimentäre UNIX-Mechanismen zur Vernetzung von Rechnern.

An der Universität von Kalifornia in Berkeley (unterstützt vom amerikanischen Verteidigungsministerium) wird (aus Version 6) eine Variante namens BSD entwickelt (Berkeley Software Distribution, erste Version 1BSD, erhebliche Erweiterungen ab Version 4.1BSD). In Berkeley werden unter anderem der Editor vi und die Shell csh entwickelt.

1979
Microsoft entwickelt eine UNIX-Version namens XENIX für Mikrocomputer, die vom ursprünglichen UNIX relativ stark abweicht. AT&T geben "UNIX Time-Sharing-System Version 7" heraus, mit vielen Verbesserungen wie Unterstützung für sehr große Dateien, ein erweitertes C und eine neue Shell.

1983
Viele Hersteller portieren UNIX auf ihre Maschinen, wodurch viele unterschiedliche Versionen entstehen. AT&T schuf 1982 eine verschmolzene Version (mit XENIX-Elementen) namens System III. Die Version IV als Zwischenstadium betrachtet und nur intern verwendet, so daß das nächste öffentliche Release 1983 das System V ist.

1984
Das IEEE (Institute for Electrical and Electronic Engineers) versucht sich mit POSIX (Portable Operating System Interface uniX) an einer Standardisierung des Systems.

1985
AT&T gibt die SVID (System V Interface Definition) heraus, eine Festlegung der Systemaufrufe, Bibliotheksroutinen und Hilfsprogramme, die ein UNIX beinhalten muß, das sich System-V nennt. Sie wird von BSD ignoriert.

1988
Mit System V.4 (Release 4, SVR4) finden viele BSD-Elemente (4.3 BSD) Eingang in das System V.

1990
Das IEEE gibt die neue Version 1 der POSIX-Standards heraus. Systemaufrufe, die in System V und BSD vorkamen, werden meist nach POSIX übernommen. Die meisten heutigen UNIXe (aber auch andere Betriebssysteme) implementieren eine Obermenge von POSIX.

1991
Die erste Version des Linux-Kernels wird im Internet verbreitet. Der finnische Informatik-Student Linus Torvalds hatte einige Zeit vorher mit einer völlig neuen Implementation eines UNIX-ähnlichen Systems für Intel-PCs begonnen (es orientiert sich an POSIX, System V, und BSD). Die Weiterentwicklung erfolgte dagegen über das gesamte Netz verteilt.
UNIX leidet noch immer unter einer fehlenden Vereinheitlichung.

Die Open Software Foundation (OSF) mit Mitgliedern wie IBM, DEC und HP standardisierten OSF/1, das stark an 4.3BSD angelehnt ist. Daraufhin gründeten AT&T, SUN und einige andere Hersteller Unix International (UI) und setzen in ihren Systemen schwerpunktmäßig auf System-V-Elemente (SVR4, SunOS).

System V Release 4 ist vollständig POSIX-kompatibel, implementiert aber als Kompatibilitäts-Service Bibliotheken und Kommandos nach 4.3BSD-Standard. BSD grenzt sich dagegen weiterhin weitgehend ab.

mischt SVR4-, POSIX- und BSD-Elemente. Es ist natürlich gewachsen und nicht am Reißbrett entstanden. An einigen Stellen werden wir daher Maschinenbefehle im C-Code, gotos, hardcodierte Konstanten und statische System-Strukturen finden - Dinge, die einem Software-Ingenieur eigentlich die Haare zu Berge stehen lassen. Diese Dinge sind aber mit neueren Versionen allmählich im Verschwinden begriffen.

Wer bereits einmal auf Entdeckungsreise gehen möchte - die Quellen von Linux liegen üblicherweise im Verzeichnis /usr/src/linux. Es gibt u.a. folgende Unterverzeichnisse:

init Initialisierung des Systems (der Kern startet beispielsweise mit der Routine start_kernel in init/main.c)
include Header-Dateien für den Kernel ( asm Assembler-nah, linux für den reinen C-Teil)
drivers Hardware-Treiber (Unterverzeichnisse block für plattenähnliche Geräte, char für zeichenorientierte Geräte, sound, scsi, etc.)
fs Filesystem (Linux unterstützt viele verschiedene Dateisysteme, Unterverzeichnisse u.a. ext2=neues Standard-Dateisystem, msdos, nfs für Network File System, minix, etc.)
mm Memory Management, Speicherverwaltung (virtueller Speicher, Paging, etc.)
ipc System-V Inter-Prozeß-Kommunikation

 
1.2: Historisches Startseite 2.1: Von-Neumann-Architektur