IT-Service Andreas Sommer

*** PC-Service, Netzwerktechnik, Support. *** 
**
 Domainhosting, Webservice, Design.
**

Wittfeldstr. 2
D-47441 Moers
Tel.: o2841  998 119-4
Involved since 1978

Home
Netzwerktechnik
Webservice
PC-Service
Aufgebohrt
Kontakt
AGB
Impressum

 

Aufgebohrt

Wie oft kommt es vor dass der Rechner nicht mehr das macht, was er eigentlich machen soll. Jetzt ist es wichtig den Fehler logisch einzukreisen. Oft müssen dann auch Einstellungen im BIOS überprüft und gegebenenfalls angepasst werden. Doch dafür benötigt man Kenntnis über den Internen Aufbau des PCs. Auch die Geschichte der Computer ist dabei Interessant, weil die meisten PCs abwärtskompatibel sind. Die Frage danach, was der Rechner alles macht, angefangen vom Einschalten bis hin zur MS-DOS-  Eingabeauffordernung, möchte ich hier beleuchten. Dabei habe ich darauf geachtet mich so weit es geht nur auf die wichtigsten Punkte zu konzentrieren, wodurch keine Vollständigkeit gewährleistet ist. Wer nicht mehr  ins BIOS kommt weil das Passwort vergessen wurde, findet hier genauso wertvolle Informationen, wie jemand der einfach mehr über die Interna des PCs und das Zusammenspiel zwischen Hard- und Software wissen will. Gerade dann, wenn nichts mehr geht weil im BIOS etwas “faul” ist und das Passwort nicht greift, kann man hier Lösungsansätze finden. Da das BIOS und das CMOS-RAM der RTC für die PC- Konfiguration eine wichtige Rolle spielt, ist hier besondere Vorsicht geboten. Für eventuell entstehende Schäden ist jeder selbst verantwortlich.

Die in diesem Dokument wiedergegebenen Informationen und Techniken werden ohne Rücksicht auf eventuelle Patentlagen mittgeteilt und dienen ausschließlich Demonstrations- und Lehrzwecken. Bei Gewerblicher Nutzung ist unbedingt das Einverständnis der Copyrightinhaber einzuholen.

 

Die Geschichte des Computers

Computer haben ihre Vorgeschichte in Rechenmaschinen. Schon etwa 3500 Jahre vor Chr. benutzten die Griechen und Ägypter eine Art Rechenbrett, den Abakus. Dieser kann als die erste Rechenmaschine angesehen werden. Erst sehr viel später folgten mechanische Rechenmaschinen, die im laufe der Entwicklung an Funktionsvielfalt gewannen.

1623 Wilhelm Schickard (Addition)
1642 Pascal  (addieren, subtrahieren)
1672 Leibnitz (alle vier Grundrechenarten)

1944 dann endlich, präsentierte Howard Aiken eine durch Lochkarten gesteuerte Rechenmaschine, welche Teile von Schreib- und Lochkartenmaschinen verwendete, die bereits von IBM gebaut wurden. So entstand der Harvard MARK 1-Rechner, der neben mechanischen Teilen auch elektronische Elemente zu nutzen wußte. Von dem Moment an, da nur elektronische Teile für den Bau einer Rechenmaschine benutzt wurden, spricht man von der ersten Computergeneration. Der erste elektronische Computer, der diesem Prinzip entsprach, war ENIAC (Electronic Numerical Integrator and Calculator). Entwickelt von J.P. Eckert, J.W. Mauchly und H. Goldstein, war ENIAC 1946 einsatzbereit und wurde speziell zu dem Zweck entworfen, durch Berechnung von Projektilbahnen, Feuertabellen für die amerikanische Artillerie aufzustellen. ENIAC bestand aus 1.500 Relais und 18.000 Elektronenröhren. Bei einem Gewicht von 30.000 kg hatte ENIAC die Ausmaße von 100 Kubikmeter und verbrauchte 150 kW. Die Stärke des Kolosses lag aber in der Arbeitsgeschwindigkeit, verglichen zum Menschen. Wofür ein Mathematiker 100 Jahre benötigen würde, benötigt ENIAC nur zwei Stunden. Die Dateneingabe erfolgte dabei in mühsamer Kleinarbeit über Schalterstellungen. Der Mathematiker John von Neumann brachte den Gedanken ins Spiel, nicht nur die Daten, sondern das gesamte Programm einzugeben und im Computer zu speichern. Diese Idee griffen  Eckert und  Mauchly dann auf und entwickelten den ersten “STORED PROGRAM COMPUTER”, UNIVAC-1.  Doch Computer mit Elektronenröhren sind sehr Störanfällig. Nach nur einigen Stunden Betriebszeit musste teilweise demontiert werden, um defekte Röhren auszutauschen. Ab 1955 verdrängte der Transistor die Röhren dann teilweise und die zweite Computergeneration wurde eingeläutet. So gab es 1960 bereits Computer, die sich aus über 200.000 Komponenten (Widerstände, Dioden, Transistoren etc.) zusammensetzten. Die Schwachstellen lagen hier in den Lötverbindungen. Die Lösung dieses Problems fand sich etwa 1965 mit der Erfindung der integrierten Schaltung, der IC´s. Mit dieser Entwicklung begann die dritte Generation und gleichzeitig das Zeitalter der Mikroelektronik. Inzwischen werden IC´s hergestellt die auf immer kleiner werdender Fläche, immer mehr Einzelelemente enthalten, womit die vierte Generation geboren ist. Auf einem Keramikplättchen mit einer Größe von ca. 20 Quadratzentimetern und einer Dicke von knapp 2 Millimetern, enthält der INTEL 80486 beispielsweise, 1,2 Millionen Transistoren. Die Schaltung enthält dabei die CUP, den mathematischen Coprozessor und zusätzlich noch einen 8 KByte großen Cache-Speicher. Doch das ist etwas vorgegriffen.
 Konstrukteure von Datapoint (USA) entwarfen 1969 eine sehr einfache Kombination aus Steuereinheit und Rechner, welche von den Firmen Texas Instrument oder INTEL auf einem IC untergebracht werden sollten. INTEL gelang das, doch der Handel mit Datapoint blieb aufgrund der Trägheit bei der Programmabarbeitung aus. Deshalb entschied  INTEL sich dazu, auf eigenes Risiko zu produzieren und brachte 1971 den 4-Bit-Mikroprozessor INTEL 4004 auf den Markt. Diese CUP besaß 2.300 integrierte MOS-Transistoren und arbeitete so schnell, wie ENIAC mit 18.000 Röhren. Seitdem werden von INTEL und zahlreichen anderen Herstellern immer bessere und schneller arbeitende Mikroprozessoren entwickelt. Bekannte Typen sind etwa: 8008,  8080, 8085, 6800, 6502, Z80, oder der 2650, einige der 8-Bit Mikroprozessoren.
Der INTEL 8008 ist ein 8-Bit-Prozessor der 1972 als 4004 Nachfolger eingeführt wurde. Dann, Ende 1973 kam der INTEL 8080 auf den Markt, welcher zehnmal schneller als der 8008-Chip arbeitete und  64 KByte Speicher adressieren konnte. Das war dann auch der Durchbruch, auf den die Computerindustrie gewartet hatte. Dass sich die Verwendung von Mikroprozessoren immer weiter durchgesetzt hat, liegt vor allem aber auch in der Tatsache, dass gleichzeitig Speicher und Input- / Output-Module als ICs auf dem Markt verfügbar waren. Ab ca. 1976 wurden dann  Mikroprozessoren entwickelt, die auf bestimmte Anwendungen spezialisiert wurden. So entstanden die Mikrokontroller und die “Micromainframes”, die speziell auf die Prozeßsteuerung ausgelegt sind. Oft sind CUP, Cache-Speicher und I/O-Module in einem Chip (IC) untergebracht, was auch als Single-Chip-Microcomputer bezeichnet wird. Vertreter dieser Gattung sind zum Beispiel der 8049, 8051 und der 8096. Im Laufe der Zeit eroberten Mikroprozessoren den Markt, die besonders für ausgedehnte mathematische und kaufmännische Anwendungen geeignet waren. Die neuesten Typen sind dabei so leistungsfähig, dass sie durchaus als “Micromainframes” bezeichnet werden können. Ein “Micromainframe” kann sehr schnell, große Informationsmengen verarbeiten und ist dazu in der Lage, umfangreiche Mikrocomputersysteme zu steuern. Die Computer, die bis 1960 gebaut wurden, waren alle so genannte Mainframes oder Maxicomputer. Diese werden auch heute noch gebaut, allerdings enorm verbessert. Mainframes arbeiten sehr schnell, haben eine große Kapazität und können zahlreiche, verschiedene Eingabe- und Ausgabe-Geräte bedienen. Der Preis eines Mainframes ist extrem hoch und oft ist besonders ausgebildetes Personal nötig, wie etwa Operator und Programmierer. Daher finden sich Mainframes fast nur in großen Betrieben und Organisationen.
 

Anfang der 70er Jahre sank der Preis für Computersysteme erheblich, so dass sich nun auch mittelgroße Betriebe Computer leisten konnten. Allerdings mussten diese System nicht so leistungsfähig sein, hier genügten Minicomputer.

Minicomputer haben zwar noch Möbelgröße, lassen sich aber mühelos in einem Büro installieren

 

Mikrocomputer

Neben Mainframes und Minicomputer gibt es noch eine dritte Kategorie, die Mikrocomputer. Die bekannteste Ausführung ist wohl der Home/Personalcomputer, um den es hier letztendlich ja auch geht. Ein Mikrocomputer läßt sich mit einem Mikroprozessor, einigen Speicher-IC´s und einem oder mehreren Input- und Output-Modulen aufbauen. Weil alle Teile des Mikrocomputers auf einer einzigen Leiterplatte (IC) montiert sind, spricht man auch vom Single-Board-Computer. Single-Board-Computer wurden zur Verwendung in der elektrischen Steuerungstechnik (Prozeßsteuerung) entworfen. Diese verfügen über Schnittstellen oder Interfaces, die den Kontakt mit der Außenwelt herstellen und lassen sich mit fertig erhältlichen Schnittstellen-Karten erweitern. Obwohl die ersten Mikroprozessoren zur Prozeßsteuerung gedacht waren, nutzten Personalcomputern sie schon bald für mathematische und administrative Aufgaben. Mikrocomputer gibt es in der Form von Single-Board-Computer, Home/Personalcomputer und Trainingskits. Wer jetzt im Wirrwarr der Begriffe den Durchblick verloren hat, der sollte sich das allgemeine Blockschaltbild eines Mikrocomputers (Chip) genauer ansehen.

Module: gelb = Eingabeeinheit, grün = Steuer- und Recheneinheit, orange  = Speicher, mint = Ausgabeeinheit.
Leitungen: dunkelblau = Steuerbus, dunkelrot = Datenbus, braun = Adreßbus.

 

Der BIOS-Standard

Mikrocomputer benötigen außer der Hardware auch noch Programme in Form von Software. Erst das optimierte Zusammenspiel aller Komponenten ermöglicht die Nutzung als Computer, so wie wir ihn kennen und wie wir es auch gewohnt sind. Die wichtigsten Routinen die dieses ermöglichen bezeichnet man als Betriebssystem. Fällt der Begriff "Betriebssystem", so kommt den meisten Anwendern dazu nur "MS-WINDOWS" in den Sinn. Aber WINDDOWS ist nicht das einzige Operationssystem, mit dem ein PC arbeiten kann. Lange bevor MS-DOS oder ähnliches auf der Festplatte installiert wird, verfügt der PC bereits über ein Betriebssystem, das ihm im wahrsten Sinne des Wortes eingebrannt wurde, das BIOS. Das BIOS stellt eine standardisierte Schnittstelle zum Zugriff auf die verschiedenen Hardware-Komponenten des Systems zur Verfügung. Es ist in einem ROM-Baustein enthalten, der sich auf der Hauptplatine befindet, und ist damit bereits beim ersten Start eines Systems präsent. Dieses "Basic Input-/Output-System" stellt die grundlegenden Funktionen zur Verfügung, die ein Programm zur Kommunikation mit der PC-Hardware und den angeschlossenen Peripherie-Geräten benötigt. Routinen zum Zugriff auf den Bildschirm finden sich darin ebenso wie Funktionen zur Ausgabe von Zeichen auf dem Drucker oder zur Abfrage von Datum und Uhrzeit. Für die PC-Programmierung sind die Dienste des BIOS so existentiell, daß nicht nur Anwendungsprogramme, sondern auch DOS ohne sie kaum denkbar wären. Denn das BIOS isoliert die Software von den spezifischen Merkmalen der Hardware und nimmt ihr damit viel Arbeit bei der Ansteuerung der verschiedenen Geräte ab. Doch es ist nicht nur Bequemlichkeit die Programmierer auf die Funktionen des BIOS zurückgreifen läßt. Es sind vor allem die Unterschiede zwischen der Hardware verschiedener PC-Anbieter, die es trotz aller "Kompatibilität" natürlich gibt. Denn genau diese kleinen Unterschiede (hier mal ein Bit anders belegt, dort ein Hardware-Register an einer anderen Portadresse) würden dem Programmierer sonst das Leben schwer machen. Schließlich kann er sich nicht über die vielen hundert verschiedenen Festplatten Gedanken machen, mit denen sein Programm in Zukunft vielleicht mal arbeiten muß. Das gleiche gilt natürlich auch für die Ansteuerung unterschiedlicher Tastaturen oder Video-Karten. Dank des BIOS muß das auch nicht berücksichtigt werden. Ob ein System also nun über eine 20-MByte- oder über eine X-GigaByte-Festplatte verfügt, ob es von IBM, Dell oder Compaq stammt: die Schnittstelle zu den Festplatten-Funktionen des BIOS und ihre Arbeitsweise ist immer dieselbe, und nur darauf kommt es an. Daß es innerhalb des BIOS dabei vielleicht ganz unterschiedlich aussieht, braucht den Programmierer nicht weiter zu interessieren. Den Siegeszug, den der PC hinter sich hat, verdankt er sicherlich zu einem guten Teil diesem Hardware-unabhängigen Konzept. Schließlich bietet es den verschiedenen Computerherstellern die Möglichkeit, PCs zu entwickeln, die keine eineiigen Zwillinge des IBM-PCs sind und trotzdem Standard-Software verarbeiten können. Definiert hat diese Schnittstelle IBM mit seinem ersten PC und später mit dem AT, dessen BIOS ein wenig erweitert wurde und wird, um den zusätzlichen Möglichkeiten des ATs Rechnung zu tragen. Diese Schnittstelle wird bis heute von allen PC-Anbietern eingehalten, denn genau das ist eine der wichtigsten Voraussetzungen, damit ein PC diesen Namen tragen darf. Mittlerweile gibt es BIOS-Systeme von mehr als einem Dutzend verschiedener Anbieter, von denen AMI, Phoenix, Award und Quadtel wohl die bekanntesten sind. Sie grenzen sich gegenüber ihrer Konkurrenz oftmals durch zusätzliche Leistungsmerkmale ab, doch die Funktionen des IBM-Standards unterstützten sie alle.

Im folgenden geht es daher  um grundsätzlichere Dinge, wie die Lage des BIOS, seinen Funktionsumfang, seine Variablen und sein Verhalten beim Start des Systems.

 

Aufbau und Lage des BIOS

Standardisiert ist neben dem Funktionsumfang auch die Lage des BIOS im Adreßraum des PCs. Denn der ROM-Baustein, in dem der BIOS-Code enthalten ist, wird immer im obersten Speichersegment F000h in den Speicher eingeblendet. Wo genau das BIOS in diesem Speichersegment beginnt, ist allerdings nicht klar definiert. Während z.B. das ursprüngliche IBM-BIOS des PCs/XTs erst an der Offsetadresse E000h seinen Anfang nimmt, wird das bekannte Phoenix-BIOS bereits ab der Offsetadresse C000h in dieses Speichersegment eingeblendet. Wo also das BIOS-ROM beginnt, hängt vor allem von seiner Größe ab, denn enden soll es ja immer an der letzten Speicherstelle des F-Segments, an der Offsetadresse FFFFh. Dies ist die letzte Speicherstelle, die durch die verschiedenen IBM/Kompatible Prozessoren,  im Real-Mode angesprochen werden kann. Für die Startadresse sind die letzten 16 Byte reserviert, beginnend ab F000h:FFF0h. In der Regel ist dort eine Sprunganweisung als 5 Byte Befehl zum POST abgelegt. Bei AMI beispielsweise lautet der Code manchmal:
(
EA 5B E0 00 F0 : JMP 0F000:0E05B ).
Realisiert wird dieser Vorgang durch folgende Technik:
Nach dem einschalten des Rechners wird über einen ELKO die RESET-Leitung für mindestens vier Taktzyklen auf HI-Pegel gelegt. Nach dem Flankenwechsel findet im Prozessor eine interne Initialisierung statt. Dabei werden die Register wie folgt beschickt:

Register:

FLAG

IP

CS

DS

SS

ES

WERT:

0002h

FFF0h

F000h

0000h

0000h

0000h

Das Flag-Register bezeichnet den Resetgrund um zwischen Kalt-(2h) und Warmstart (1234h) zu unterscheiden. Die Startadresse setzt sich aus dem Inhalt von CS:IP zusammen, hier beginnt der sogenannte POST mit den  verschiedenen Tests. Hinter diesem Befehl folgen noch elf Byte bis zum Ende des ROM-Bausteins, die meistens zur Speicherung der BIOS-Version bzw. deren Freigabedatum genutzt werden. 
Der POST umfaßt zahlreiche Tests, die sich auf die zentrale PC-Hardware (Prozessor, Speicher, Interrupt-Controller, DMA etc.) beziehen. Darüber hinaus werden im Verlauf dieses Tests aber auch die Hardware-Erweiterungen auf den Erweiterungskarten initialisiert, damit beispielsweise die Video-Karte ihren Dienst aufnehmen kann. Wird während eines dieser Tests ein Fehler festgestellt, ertönt in der Regel ein Signalton, und auf dem Bildschirm erscheint eine entsprechende Fehlermeldung und/oder ein Fehlercode.
Die folgende Auflistung zeigt die verschiedenen Tests und die Reihenfolge, in der sie durchgeführt werden. Diese Reihenfolge ist nicht verbindlich, wird von den verschiedenen BIOS-Herstellern jedoch mehr oder weniger genau eingehalten.

POST-Tests, die sich auf die zentrale PC-Hardware  beziehen:

  • Funktionsprüfung CPU (Arithmetik, Real-Mode, Protected-Mode  etc.)
  • Bildung einer Checksumme über das BIOS-ROM
  • Bildung einer Checksumme über das CMOS-RAM der batteriegepufferten Echtzeituhr und Vergleich mi der darin festgehaltenen  Checksumme
  • Test und Initialisierung des DMA-Controllers
  • Test und Initialisierung desTastatur-Controllers
  • Überprüfung der ersten 64 KByte des RAM-Speichers
  • Test und Initialisierung des Interrupt-Controllers
  • Test und Initialisierung des Cache-Controllers (nur bei  ATs)

Zunächst werden die einzelnen Funktionen des Prozessors, seine Register  und einige Befehle getestet. Wird bei diesem Test ein Fehler entdeckt, wird das  System ohne Ausgabe einer Fehlermeldung (dies ist durch den Defekt des  Prozessors auch nicht möglich) angehalten. Besteht der Prozessor den Test jedoch, wird im nächsten Schritt eine Prüfsumme über das BIOS-ROM gebildet, um festzustellen, ob hier ein Defekt vorliegt. Danach werden die einzelnen Chips  auf der Hauptplatine (der 8259-Interrupt- und der 8237-DMA-Controller, aber auch  die RAM-Chips) auf ihre Funktionsfähigkeit getestet und initialisiert.

POST-Tests der System-Erweiterungen:

  • Video-Controller
  • Hauptspeicher über 64 KByte
  • Serielle und parallele Schnittstelle
  • Disketten- und Festplatten-Controller

Nachdem die Funktionstüchtigkeit der Hauptplatine festgestellt wurde,  werden auch die Peripheriegeräte (Tastatur, Diskettenlaufwerke, etc.) in den  Test einbezogen. Neben diesen auf die Hardware bezogenen Aufgaben müssen selbstverständlich auch die BIOS-Variablen und die Interrupt-Vektor-Tabelle initialisiert werden. Neben dem BIOS-Code und einigen statischen Variablen (z.B. die Festplatten-Parameter-Tabelle) enthält das ROM-BIOS auch verschiedene Informationen, die den PC-Hersteller, die BIOS-Version sowie den  PC-Typ kennzeichnen. Diese Informationen können recht einfach ausgelesen werden.  Interessierte können sich den Inhalt dieser Speicherstellen mit wenigen Handgriffen anschauen. Dies geschieht durch das DOS-Programm DEBUG. Um das Programm zu starten wird an der Eingabeaufforderung der Befehl debug eingegeben. Zur Anzeige der letzten 16 Byte des BIOS-ROMs  reicht der Befehl d f000:fff0 l  10
DEBUG gibt daraufhin in der nächsten Bildschirmzeile den Inhalt dieser Speicherstellen als Hexadezimalzahl und als  ASCII-Zeichen aus. Die folgende Abbildung zeigt, wie Tag, Monat und Jahr vom BIOS-Hersteller zweiziffrig und von einem "/" getrennt kodiert wurden. Nach der  Schreibweise im englischsprachigen Raum  wird der Monat vor dem Tag  genannt.

C:\>debug

   -d F000:FFF0 L 10

    F000:FFF0  EA 5B E0 00 F0 30 31 2F-31 35 2F 39 37 00 FC 00     .....01/15/97..
   -q

    C:\>

Mehr noch als die BIOS-Version ist für den Anwender bestimmter BIOS-Funktionen die sogenannte Modellidentifikation von Bedeutung. Sie gibt den Typ des PCs an, um den es sich handelt. Zu finden ist dieses Byte an der Speicherstelle F000h:FFFEh, in diesem Fall also “FC”.
Die Bedeutung der Bytes ist dabei folgendermaßen definiert:

           CODE : Beschreibung

  • F8   :  PS/2, 386 und 486/16-50MHz/ISA-16Bit, MCA-16Bit, MCA-32Bit
  • F9    :  PC Convertible, 80C8/4,77MHz/ISA-8Bit
  • FA    :  PS/2, 8086/8MHz/ISA-8Bit
  • FB     : PC-XT, 8088/4,77MHz/ISA-8Bit
  • FC    :  PC-AT, PS/1,PS/2, 286/6-10 MHz/ISA-16 oder MCA-16Bit
  • FD    :  PC Junior, 8088/4,77MHz/ISA-8Bit
  • FE      : PC-XT, 8088/4,77MHz/ISA-8Bit
  • FF      : einfacher PC, 8088/ 4,77 MHz/ISA-8Bit

Leider kann man sich auf diese Werte nicht immer verlassen, da so mancher BIOS-Hersteller sein eigenes Süppchen kocht. Im Grunde genommen ist das BIOS nichts anderes als ein Programm, das in einem ROM-Baustein eingefroren wurde. Als solches benötigt es für seinen Betrieb aber auch Variablen, wie dies bei einem Programm ganz selbstverständlich ist. Da Variablen aber nicht in ROM-Bausteinen verwaltet werden können, weil sie sich nicht so ohne weiteres beschreiben lassen, wurde ein Teil des RAM-Speichers für die verschiedenen BIOS-Variablen reserviert. Dieser Bereich beginnt an der Adresse 0040h:0000h und erstreckt sich über etwas mehr als 256 Byte. Man spricht in diesem Zusammenhang auch von dem "BIOS-Variablen-Segment" oder dem "BIOS-Variablen-Bereich". Die Belegung dieses Speicherbereichs ist weitgehend standardisiert, weil viele DOS-Programme direkt auf die verschiedenen Variablen zugreifen und es sich die BIOS-Hersteller daher nicht leisten können, eine andere Anordnung der Variablen zu wählen. Denn als Teil des RAM-Speichers steht der Zugriff auf diese Variablen jedem Programm offen, das in der Lage ist, einen FAR-Zeiger auf die gewünschte Variable zu kreieren und ihn zu dereferenzieren. Die "Standardisierung" gilt uneingeschränkt allerdings nur für die BIOS-Variablen, die bereits mit dem PC und dem XT eingeführt wurden. Sie belegen den ersten Teil des BIOS-Variablen-Segments und reichen bis zur Offsetadresse 0071h. Was danach kommt, wurde erst mit dem AT, EGA- und VGA-Karten und den PS/2-Systemen von IBM eingeführt. Und in diesem Bereich gibt es einige dunkle Stellen, deren Inhalt von den verschiedenen Anbietern von BIOS-Systemen, PC-Herstellern und Video-Karten unterschiedlich genutzt wird. Wenn Variablen nur unter einer bestimmten Konfiguration definiert sind, ist dieses bei der folgenden Beschreibung der BIOS-Variablen vermerkt. Beschrieben werden die Namen und Bedeutung der verschiedenen Variablen, natürlich auch ihre Offsetadressen relativ zum Speichersegment 0040h:0000h und das Datenformat, in dem die Informationen niedergelegt werden. Außerdem wird der BIOS-Interrupt genannt, der die jeweilige Variable nutzt

 

Portadressen der seriellen Schnittstellen:

Adresse

Datenformat

Interrupt

00h-07h

4 WORD

INT 14h

Während des POST (Power-On-Self-Test) ermittelt das BIOS die Konfiguration des PCs und stellt dabei unter
anderem die Anzahl der installierten seriellen Schnittstellen (RS232) fest. Die Portadressen dieser Karten
 verzeichnet es dabei in diesem Array, das aus vier Words besteht. Jedes Word repräsentiert die Basisadresse
 einer der maximal vier gespeichert installierbaren Karten. Als Portadresse von Schnittstellen, die nicht
 angetroffen wurden, wird der Wert 0 gespeichert.

Portadressen der parallelen Schnittstellen:

Adresse

Datenformat

Interrupt

08h-0Fh

4 WORD

INT 17h

Analog zu der obigen Variable werden hier die Basisadressen der maximal vier installierbaren parallelen Schnittstellen verzeichnet. Auch hier gilt wieder: Für Schnittstellen, die nicht präsent sind, wird als Portadresse 0 gespeichert.

Konfiguration:

Adresse

Datenformat

Interrupt

10h-11h

1 WORD

INT 11h

Dieses Konfigurations-Word, repräsentiert die Hardware-Ausstattung des PCs, wie sie auch über den BIOS- Interrupt 11h abgerufen werden kann und während des POST vom BIOS ermittelt wird. Diese Variable wird als ein Bit-Feld verwaltet, wobei die Bedeutung der einzelnen Bits zwischen PCs und XTs auf der einen und ATs auf der anderen Seite differiert.
 

POST-Status #1

Adresse

Datenformat

Interrupt

12h

1 Byte

POST

Dieses Byte dient zur Speicherung von Informationen während des Selbsttests des Systems, der während des POST und nach einem Warmstart durchgeführt wird. Später wird es auch von den BIOS-Routinen zur  Erkennung von Tastenanschlägen verwendet. Für den Programmierer weist es keinen praktischen Nutzen auf.

Größe des RAM-Speichers

Adresse

Datenformat

Interrupt

13h-14h

1 Word

INT 12h

An dieser Speicheradresse befindet sich ein Word, das die gesamte Größe des RAM-Speichers in KByte angibt. Nicht eingerechnet ist dabei der EMS-Speicher, weil der nicht zum normalen Hauptspeicher gehört. Diese Variable kann über den BIOS-Interrupt 12h abgefragt werden.

POST-Status #2

Adresse

Datenformat

Interrupt

15h-16h

1 Word

POST

Auch dieses Word wird lediglich während des POST zum Testen der Hardware benötigt. Es wird von den verschiedenen BIOS-Herstellern unterschiedlich genutzt

Tastatur-Status #1

Adresse

Datenformat

Interrupt

17h

1 Byte

INT16h

Dieses Byte wird als "Tastatur-Status-Byte" bezeichnet, weil es den Status der Tastatur und verschiedener Tasten wiedergibt. Den Inhalt dieses Byte kann man auch mit Hilfe der Funktion 02h des BIOS-Tastatur-Interrupts 16h ermitteln. Über den Zugriff auf dieses Byte ist es z.B. möglich, den Insert- oder Großschrift- (Caps-) Modus an- oder auszuschalten. Dabei sind jedoch nur die höherwertigen 4 Bits dieses Byte interessant, weil die unteren vier Bits keinen Umschalt-Status, sondern lediglich den aktuellen Status der genannten Tasten widerspiegeln.
                              
                                    

Erweiterter Tastatur-Status

Adresse

Datenformat

Interrupt

18h

1 Byte

INT16h

Die Bedeutung dieses Byte ähnelt seinem Vorgänger, jedoch spricht man hier vom "erweiterten Tastatur-Status-Byte". Denn dieses Byte wird erst seit der Einführung der MF II-Tastatur genutzt. Im Unterschied zum ersten Tastatur-Status-Byte wird hier nicht auf die verschiedenen Umschalt-Modi, sondern auf die Tasten Bezug genommen, die diese Modi an- oder ausschalten. Eine Ausnahme bildet lediglich das Bit 3, das den Pausenmodus anzeigt.



Code bei ASCII-Eingabe

Adresse

Datenformat

Interrupt

19h

1 Byte

INT16h

Während der Eingabe eines ASCII-Codes über den numerischen Tastenblock in Verbindung mit der [Alt]-Taste wird in diesem Byte der bisher eingegebene Code gespeichert.

Nächstes Zeichen im Tastaturpuffer

Adresse

Datenformat

Interrupt

1Ah-1Bh

1 Word

INT16h

Die Offsetadresse des nächsten zu lesenden Zeichens im Tastaturpuffer wird in diesem Word verzeichnet (siehe auch 1Eh).

Letztes Zeichen im Tastaturpuffer

Adresse

Datenformat

Interrupt

1Ch-1Dh

1 Word

INT16h

Diese Variable enthält die Offsetadresse des letzten Zeichens, das sich derzeit im Tastaturpuffer befindet (siehe auch 1Eh).

Tastaturpuffer

Adresse

Datenformat

Interrupt

1Eh-2Eh

16 Word

INT16h

In diesem Speicherbereich findet der Tastaturpuffer des BIOS Platz. Da jedes darin gespeicherte Zeichen 2 Byte in Anspruch nimmt, bietet er mit seiner Größe von 32 Byte maximal 16 Zeichen Platz. Bei einem normalen ASCII-Zeichen wird zunächst der ASCII-Code und dann der Scan-Code des Zeichens abgespeichert. Bei erweiterten Tastaturcodes ist der ASCII-Code 0, weil der eigentliche Zeichencode erst im darauffolgenden Byte steht. Der Puffer ist als Ringpuffer konzipiert, weil ständig Zeichen ausgelesen werden und neue Zeichen hinzukommen. Die Adresse des nächsten Zeichens, das aus dem Tastaturpuffer gelesen werden muß, gibt dabei die Variable an der Offsetadresse 1Ah an. Wird ein Zeichen gelesen, bewegt sich dieser Zeiger um 2 Byte in Richtung auf das Ende des Tastaturpuffers. Wurde aus der letzten Speicherstelle des Puffers ein Zeichen gelesen, wird dieser Zeiger wieder auf den Anfang des Puffers gesetzt, damit sich der Kreis (Ring) wieder schließt. Nicht anders verhält es sich mit dem Zeiger in der Speicherstelle 1Ch, der das Ende des Tastaturpuffers angibt. Betätigt der Anwender eine Taste, wird der Tastencode im Tastaturpuffer an der Stelle abgespeichert, die dieser Zeiger angibt. Danach wird er um 2 Byte in Richtung auf das Ende des Puffers vorgerückt. Wurde ein neues Zeichen im letzten Word des Tastaturpuffers gespeichert, wird dieser Zeiger wieder an den Anfang des Puffers gesetzt. Das Verhältnis zwischen dem Anfangs- und dem Endzeiger zeigt dadurch den Status des Puffers an, wobei zwei Zustände von besonderer Bedeutung sind. Beim ersten fallen die beiden Zeiger aus den Variablen an der Offsetadresse 1Ah und 1Ch zusammen. Das bedeutet nichts anderes, als daß der Tastaturpuffer zur Zeit leer ist. Der andere Zustand tritt ein, wenn ein Zeichen hinter dem bisher letzten Zeichen an den Tastaturpuffer angehangen werden soll, die Inkrementierung des Ende-Zeigers ihn aber "auf" den Anfangszeiger prallen ließe. Das nämlich zeigt an, daß der Tastaturpuffer voll ist und deshalb keine weiteren Zeichen mehr aufnehmen kann.

Diskettenlaufwerk-Rekalibrierung

Adresse

Datenformat

Interrupt

3Eh

1 Byte

INT13h

Die vier niederwertigen Bits dieser Variable korrespondieren mit den maximal vier Diskettenlaufwerken, die vom BIOS verwaltet werden können. Sie zeigen an, ob das jeweilige Diskettenlaufwerk rekalibriert werden muß, weil ein Lese- oder Schreibzugriff fehlgeschlagen ist. Darüber hinaus wird das Bit 7 auf 1 gesetzt, wenn ein Diskettenlaufwerk den Disketten-Hardware-Interrupt ausgelöst hat.


Diskettenlaufwerk-Motor-Status

Adresse

Datenformat

Interrupt

3Fh

1 Byte

INT13h

Auch die vier unteren Bits dieses Byte beziehen sich auf die vier Diskettenlaufwerke. Sie signalisieren, ob der jeweilige Diskettenmotor des Laufwerks in Bewegung ist. Zusätzlich dazu wird das Bit 7 während Schreib- und Formatierungszugriffen gesetzt, während Lese- und Suchvorgängen aber gelöscht.



Diskettenlaufwerk-Zeit-Zähler

Adresse

Datenformat

Interrupt

40h

1 Byte

INT13h

Dieses Byte enthält einen Zeitzähler, der die Anzahl der Timer-Aufrufe (Interrupt 08h) angibt, die bis zum Ausschalten des Diskettenmotors noch verstreichen darf. Da das BIOS jeweils nur auf ein Diskettenlaufwerk gleichzeitig zugreifen kann, bezieht sich dieser Zähler auf das Laufwerk, das zuletzt angesprochen wurde. Direkt nachdem der Zugriff auf ein Laufwerk beendet wurde, plaziert das BIOS den Wert 37 in dieser Variable. Dies entspricht einer Zeitdauer von ca. zwei Sekunden. Wird innerhalb dieser Zeit ein erneuter Diskettenzugriff ausgeführt, wird der Zähler wieder auf seinen Startwert gesetzt.

Diskettenstatus

Adresse

Datenformat

Interrupt

41h

1 Byte

INT13h

In diesem Byte ist der Status des letzten Diskettenzugriffs verzeichnet. Enthält es den Wert 0, so wurde die letzte Diskettenoperation ordnungsgemäß ausgeführt. Ein anderer Wert signalisiert einen vom Controller des Diskettenlaufwerks übermittelten Fehler-Code, mit folgender Bedeutung.

Fehler-Code

Ursache

000d

XXX00000b

00h

Kein Fehler

001d

XXX00001b

01h

Unbekannte Funktion aufgerufen

002d

XXX00010b

02h

Adressmarkierung nicht gefunden

003d

XXX00011b

03h

Schreibschutzfehler

004d

XXX00100b

04h

Sektor nicht gefunden

006d

XXX00110b

06h

Laufwerk nicht geschlossen

008d

XXX01000b

08h

DMA – Überlauf

009d

XXX01001b

09h

DMA – Segmentüberschreitung

012d

XXX01100b

0Ch

Unbekanntes Format

016d

XXX10000b

10h

CRC–Fehler bei Leseoperation

032d

001XXXXXb

20h

Controller Fehler

064d

010XXXXXb

40h

Datei nicht gefunden

128d

100XXXXXb

80h

Laufwerk nicht bereit

Die Werte in der ersten Spalte sind Dezimal. Die zweite Spalte ist Binär, wobei irrelevante Bits als X gekennzeichnet sind und die dritte Spalte ist Hexadezimal notiert.

Status des Disketten-Controllers

Adresse

Datenformat

Interrupt

42h-48h

7 Byte

INT13h

Diese sieben Byte geben den Status des Disketten-Controllers an. Bei einem Festplattensystem nehmen sie zusätzlich den Status des Festplatten-Controllers auf.

Aktueller Videomodus

Adresse

Datenformat

Interrupt

49h

1 Byte

INT10h

In diesem Byte merkt sich das BIOS den Code des aktuellen Videomodus. Es handelt sich dabei um den gleichen Wert, der bei der Aktivierung eines Bildschirmmodus über die Funktion 00h des BIOS-Video-Interrupts 10h angegeben werden muß.

Anzahl der Bildschirmspalten

Adresse

Datenformat

Interrupt

4Ah-4Bh

1 Word

INT10h

Das Word an dieser Speicherstelle nimmt die Anzahl der Spalten pro Bildschirmzeile im aktuellen Video-Modus auf.

Umfang der Bildschirmseite

Adresse

Datenformat

Interrupt

4Ch-4Dh

1 Word

INT10h

In diesem Word verzeichnet das BIOS die Anzahl der Byte, die zur Darstellung einer Bildschirmseite im aktuellen Video-Modus benötigt werden. Im 80*25-Zeichen-Textmodus sind dies z.B. 4000 Byte.

Offsetadresse der aktuellen Bildschirmseite

Adresse

Datenformat

Interrupt

4Eh-4Fh

1 Word

INT10h

Die Adresse der aktuell auf dem Bildschirm dargestellten Bildschirmseite relativ zum Anfang des Video-RAM wird in diesem Word vermerkt

Cursor-Position in den acht Bildschirmseiten

Adresse

Datenformat

Interrupt

50h-5Fh

8 Word

INT10h

Das BIOS ist in der Lage, maximal 8 Bildschirmseiten zu verwalten. Für jede dieser Bildschirmseiten speichert es in diesen 8 Word die aktuelle Cursor-Position. Für jede Seite wird dabei im niederwertigen Byte die Bildschirmspalte und im darauffolgenden Byte die Bildschirmzeile abgespeichert.

Startzeile des Bildschirm-Cursor

Adresse

Datenformat

Interrupt

60h

1 Byte

INT10h

In diesem Byte wird die Startzeile des blinkenden Bildschirm-Cursors (0 bis 7 bei einer Color-, 0 bis 14 bei einer monochromen Bildschirmkarte) festgehalten. Eine manuelleÄnderung dieser Variable hat allerdings keinen Einfluß auf das Erscheinungsbild des Bildschirm-Cursors, da dieser Wert vom BIOS an den Video-Controller weitergeleitet werden muß.

Endzeile des Bildschirm-Cursors

Adresse

Datenformat

Interrupt

61h

1 Byte

INT10h

Die Endzeile des blinkenden Bildschirm-Cursors wird in dieser Speicherstelle abgespeichert. Sie kann bei einer Color-Karte zwischen 0 und 7 und bei einer monochromen Bildschirmkarte zwischen 0 und 14 liegen.

Nummer der aktuellen Bildschirmseite

Adresse

Datenformat

Interrupt

62h

1 Byte

INT10h

In diesem Byte wird die Nummer der aktuell auf dem Bildschirm dargestellten Bildschirmseite verzeichnet.

Portadresse des Video-Controllers

Adresse

Datenformat

Interrupt

63h-64h

1 Byte

INT10h

Die Basisportadresse der Video-Karte wird in diesem Word verzeichnet. Enthält ein PC mehrere Video-Karten, so handelt es sich dabei um die Portadresse der Video-Karte, die gerade aktiv ist. Bei monochromen Bildschirmkarten lautet diese Adresse 3B4h, bei CGA, EGA- und VGA-Karten hingegen 3D4h. Dadurch läßt sich mit Hilfe dieses Words leicht feststellen, ob derzeit eine monochrome oder eine Color-Video-Karte aktiv ist.

Inhalt des Modusauswahlregisters

Adresse

Datenformat

Interrupt

65h

1 Byte

INT10h

Hier wird der Inhalt des Modusauswahlregisters einer Video-Karte festgehalten. Er definiert den aktuellen Bildschirmmodus.

Inhalt des Palettenregisters

Adresse

Datenformat

Interrupt

66h

1 Byte

INT10h

Color-Karten verfügen über Palettenregister, mit deren Hilfe in den CGA-kompatiblen Grafikmodi eine Farbpalette ausgewählt wird. Der Wert, der vom BIOS zuletzt in ein solches Register geschrieben wurde, wird in dieser Variablen verzeichnet.

Verschiedenes

Adresse

Datenformat

Interrupt

67h-6Bh

5 Byte

POST

Die BIOS-Versionen der ersten PCs, die noch über die Möglichkeit des Anschlusses eines Kassettenrecorders zur Datenspeicherung verfügten, nutzten diese 5 Byte im Zusammenhang mit der Datenspeicherung auf diesem Gerät. XTs und ATs, die über diese Möglichkeit nicht mehr verfügen, benutzen diese Speicherstellen für andere Zwecke.

Zeit-Zähler

Adresse

Datenformat

Interrupt

6Ch-6Fh

1 Dword

INT1Ah

Diese vier Byte werden vom BIOS als ein 32-Bit-Zähler behandelt, der mit jedem Timer-Aufruf inkrementiert wird. Dadurch ist eine Zeitmessung und Zeitangabe möglich. Der Wert dieses Zählers kann auch mit Hilfe des BIOS-Interrupts 1Ah gelesen und gesetzt werden. Sind 24 Stunden vergangen, wird er wieder auf 0 gesetzt, um anschließend erneut hochgezählt zu werden.

24-Stunden-Flag

Adresse

Datenformat

Interrupt

70h

1 Byte

INT1Ah

Dieses Byte wird vom Timer-Interrupt inkrementiert, sobald ein Tag vergangen ist und der Zeit-Zähler wieder auf 0 gesetzt wird. Über dieses Byte kann dadurch die Anzahl der Tage ermittelt werden, seit denen ein PC nicht mehr abgeschaltet oder gebootet wurde. Wird mit Hilfe des BIOS-Zeit-Interrupts 1Ah die Zeit neu gesetzt und dadurch der Wert des Zeit-Zählers manipuliert, wird dieses Byte wieder auf 0 gesetzt.

CTRL-Break-Flag

Adresse

Datenformat

Interrupt

71h

1 Byte

INT16h

Das Bit 7 dieses Byte wird auf 1 gesetzt, wenn das BIOS die Tastenkombination [Control]+[Break] entdeckt. Einmal gesetzt wird, es vom BIOS allerdings nicht mehr zurückgesetzt.

                                     Hier endet der BIOS-Variablenbereich des normalen PCs.

Bedingt durch die Hardware-Erweiterungen des XTs und des ATs gegenüber dem PC folgen nun einige Variablen, die nachträglich eingeführt worden sind.

POST-Test

Adresse

Datenformat

Interrupt

72h-73h

1 Word

POST

Beim POST kann das BIOS anhand dieses Flags erkennen, ob ein Kaltstart oder ein Warmstart ([Control]+[Alt]+[Delete]) vorliegt. Denn vor einem Warmstart schreibt die dafür zuständige BIOS-Routine den Wert 1234h in diese Variable. Das verhindert beim POST dann, daß im Gegensatz zu einem Kaltstart kein Speichertest durchgeführt wird.

Status der letzten Festplatten-Operation, nur AT

Adresse

Datenformat

Interrupt

74h

1 Byte

INT 13h

In diesem Byte wird der Status der Festplatten-Operation aufgezeichnet, die das BIOS zuletzt durchgeführt hat.
Dabei gilt:

                   01h: Nicht vorhandene Funktion oder nicht vorhandenes Laufwerk angesprochen.
                   02h: Adreßmarkierung nicht gefunden
                   04h: Sektor nicht gefunden
                   05h: Fehler  bei Reset des Controllers
                   07h: Fehler beim initialisieren des Controllers
                   09h: DMA Übertragungsfehler, Segmentgrenze überschritten
                   0Ah: Sektor nicht in Ordnung
                   0Bh: Fehlerhafte Spur entdeckt
                   0Dh: Ungültige Anzahl von Sektoren in einer Spur
                   0Eh: Adreßmarkierung nicht gefunden
                   0Fh: DMA Überlauf
                   10h: Lesefehler
                   11h: Lesefehler über ECC korrigiert
                   20h: Controller defekt
                   40h: Suchoperation gescheitert
                   80h: Time out (Laufwerk reagiert nicht)
                   AAh: Laufwerk nicht bereit
                   CCh: Schreibfehler.
 

Anzahl der Festplatten, nur AT

Adresse

Datenformat

Interrupt

75h

1 Byte

INT 13h

Hier wird die Anzahl der angeschlossenen Festplatten verzeichnet.

Festplatten-Control-Byte, nur AT

Adresse

Datenformat

Interrupt

76h

1 Byte

INT 13h

Dieses Byte wird vom BIOS-Interrupt 13h bei der Steuerung der Festplatte genutzt. Welche genaue Bedeutung es hat, ist nicht bekannt.

Festplatten-Port, nur AT

Adresse

Datenformat

Interrupt

77h

1 Byte

INT 17h

Hier wird die Basisadresse des Festplatten-Controllers gespeichert

Time-Out-Zähler parallele Schnittstelle

Adresse

Datenformat

Interrupt

78h-7Bh

4 Byte

INT 14h

Bei dieser Variable handelt es sich um ein Array, das aus 4 Byte besteht. Jedes dieser Byte korrespondiert mit einer der parallelen Schnittstellen und gibt deren Time-Out-Zähler an. Er legt die Zeit fest, nach deren Verstreichen das BIOS eine Übertragung über die parallele Schnittstelle mit einem Fehler abbricht, wenn der Gegenüber das Zeichen nicht entgegennimmt.

Time-Out-Zähler serielle Schnittstelle

Adresse

Datenformat

Interrupt

7Ch-7Fh

4 Byte

INT 16h

Dieses Array nimmt die gleiche Aufgabe wahr, wie das Array an der Offsetadresse 78h, bezieht sich jedoch auf die seriellen Schnittstellen.

Startadresse Tastaturpuffer, nur AT

Adresse

Datenformat

Interrupt

80h-81h

1 Word

INT 16h

In diesem Word steht die Offsetadresse des Tastaturpuffers bezogen auf das BIOS-Variablen-Segment 0040h. Die Intention bei der Einführung war der Wunsch, eine Vergrößerung des Tastaturpuffers durch Verschieben möglich zu machen. Das scheiterte jedoch daran, daß viele Programme den Tastatur-Puffer immer an der Offsetadresse 001Eh vermuten, ohne seine Lage zuvor über dieses Word abzufragen. Hier ist deshalb immer die Adresse 001Eh verzeichnet, ohne daß der Puffer durch Veränderung dieses Wertes verschoben werden könnte.

Endadresse des Tastaturpuffers, nur AT

Adresse

Datenformat

Interrupt

82h-83h

1 Word

INT 10h

Diese Variable stellt das Gegenstück zu ihrer Vorgängerin dar, denn sie verweist auf das Ende des Tastatur-Puffers im BIOS-Variablen-Segment. Damit teilt sie aber auch das Schicksal ihrer Vorgängerin, denn sie wird im Grunde genommen gar nicht gebraucht.

Anzahl der Bildschirmzeilen, nur EGA/VGA

Adresse

Datenformat

Interrupt

84h

1 Byte

INT 10h

Das BIOS der EGA- und VGA-Karten - und nur das – hält in dieser Variable die Anzahl der Bildschirmzeilen im Textmodus fest.

Punkthöhe der Zeichen, nur EGA/VGA

Adresse

Datenformat

Interrupt

85h-86h

1 Word

INT 10h

Bei EGA- und VGA-Karten wird hier die Anzahl der Punktzeilen pro Zeichen im aktuellen Videomodus festgehalten. In Relation zur Gesamtzahl der Punktzeilen ergibt sich daraus die Anzahl der sichtbaren Textzeilen.

EGA-/VGA-Status-Bereich

Adresse

Datenformat

Interrupt

87h-8Ah

4 Byte

INT 10h

Dieser Bereich steht EGA- und VGA-Karten zur freien Verfügung und wird von den verschiedenen Anbietern derartiger Karten ganz unterschiedlich genutzt.

PS/2 Diskette und Festplatten Parameter, nur PS/2

Adresse

Datenformat

Interrupt

8Bh-95h

11 Byte

INT 16h

Von PS/2-Systemen werden in diesem Bereich verschiedene Informationen abgelegt, die im Zusammenhang mit dem Zugriff auf Disketten und Festplatten stehen.

MF II-Status nur AT

Adresse

Datenformat

Interrupt

96h

1 Byte

INT 16h

Bei Systemen mit MF II-Tastatur fungiert dieses Byte als Bit-Feld, dessen Bestandteile verschiedene Ereignisse in bezug auf die interne Tastatursteuerung des BIOS anzeigen. Interessant ist dabei für den Programmierer das Bit 4, das gesetzt ist, wenn am Rechner eine MF II-Tastatur mit 101 (amerikanische Version) oder 102 (europäische Version) Tasten angeschlossen ist. Ein Programm, das auf die erweiterten Tasten der MF II-Tastatur (z.B. [F11] und [F12]) angewiesen ist, kann durch Abfrage dieses Bits feststellen, ob diese Tasten verfügbar sind.

LED-Status, nur AT

Adresse

Datenformat

Interrupt

97h

1 Byte

INT 16h

Bei MF II-Tastaturen spiegelt sich in diesem Byte der Status der verschiedenen Tastatur-LEDs wider, die mit den drei Umschaltmodi korrespondieren. Durch Setzen oder Löschen dieser Bits können die verschiedenen LEDs manuell ein- oder ausgeschaltet werden, allerdings muß nach der Umschaltung eine der Funktionen des Tastatur-Interrupts 16h aufgerufen werden, damit das ROM-BIOS dieses Byte abfragt und die korrespondierenden LEDs an- oder ausschaltet. Am besten ist dazu die Funktion 02h geeignet, die den aktuellen Tastaturstatus zurückliefert, ohne ein Zeichen von der Tastatur abzufragen.



Zeiger auf Wait-Flag, nur AT

Adresse

Datenformat

Interrupt

98h-9Bh

1 Dword

INT 15h

Dieser FAR-Zeiger steht in Verbindung mit der Funktion 83h des BIOS-Interrupts 15h. Mit Hilfe dieser Funktion läßt sich eine BYTE-Variable definieren, deren Bit 7 nach dem Verstreichen einer bestimmten Zeit auf 1 gesetzt werden soll. Es ist die Adresse dieser Variablen, die hier im BIOS-Variablen-Segment gespeichert wird.

Zeit-Zähler, nur AT

Adresse

Datenformat

Interrupt

9Ch-9Fh

1 Dword

INT 15h

Auch diese Variable steht in Verbindung mit der Funktion 83h des BIOS-Interrupts 15h. Darüber hinaus steht diese allerdings auch der Funktion 86h zu Diensten. Beide benötigen eine Variable, in der sie die Zeitdauer ablegen können, die ihnen ihr Aufrufer übergibt.

Wait-Status, nur AT

Adresse

Datenformat

Interrupt

A0h

1 Byte

INT 15h

Dies ist die letzte Variable, die die Funktion 86h des Interrupts 15h für sich in Anspruch nimmt. Hier wird festgehalten, ob die Wartezeit abgelaufen, und die Funktion 86h gerade aktiv ist.



Reserviert

Adresse

Datenformat

Interrupt

A1h-FFh

95 Byte

? ? ?

Dieser Bereich gilt als "reserviert", was ihn zur Spielwiese für zahllose BIOS-Erweiterungen und Programme macht.

Hardcopy-Rekursions-Flag

Adresse

Datenformat

Interrupt

100h

1 Byte

INT 05h

Allen Mitgliedern der PC-Familie (PC, XT und AT) ist eine Variable in der Speicherstelle 0050:0000h gemeinsam. Sie wird von der Hardcopy-Routine (Interrupt 05h) als Rekursions-Flag genutzt, damit während der Ausgabe einer Hardcopy nicht noch eine Hardcopy in Druck gegeben wird. Dazu wird das Flag beim Eintritt in die Hardcopy-Routine auf 1 gesetzt, während es sonst den Wert 0 inne hat.Nach dem Ende einer Hardcopy wird das Flag darüber hinaus auf 255 gesetzt, wenn ein Fehler bei der Ausgabe eingetreten ist.

 

 

Die batterie-gepufferte Echtzeituhr des ATs.

Weil das BIOS als ROM (nur lese Speicher) nicht ohne weiteres beschrieben werden kann, werden einige Einstellungen zur Anpassung des Systems in ein spezielles RAM ausgelagert. Daher besitzen Computer ab 286er-CPU  eine batteriegepufferte Uhr, die im Englischen als RTC (Real Time Clock) bezeichnet wird und auf der Hauptplatine untergebracht ist. Sie ist Teil eines MC-146818A-Prozessors der Firma Motorola (oder eines kompatiblen Bausteins), der neben dieser Uhr auch noch 64 Byte batteriegepuffertes RAM enthält, das wahlweise beschrieben oder gelesen werden kann. Dieser RAM-Speicher nimmt neben Datum und Uhrzeit auch die Konfigurationsdaten des Gesamtsystems auf, welche im Bios-Setup vorgenommen werden. Angesprochen wird dieser Baustein über die Portadressen 70h bis 7Fh, wobei für uns nur die Ports 70h und 71h von Interesse sind. In der Regel wird das CMOS-RAM, welches typischerweise eine Größe von 64 Byte aufweist, über die I/O-Adressen 70h (Index-Port) und 71h (Data-Port) angesprochen. EISA-, PS/2- und Plug & Play-konforme PCs verwenden demgegenüber ein erweitertes CMOS-RAM (mit 128 Byte) zur Speicherung der zusätzlichen Konfigurationsparameter. Das bekannte AMI-HI-FLEX-BIOS verwendet ebenfalls ein erweitertes CMOS-RAM für spezielle Erweiterungen. Auf die Register, die durch den RTC-Chip verwaltet werden, kann nach folgendem Schema zugegriffen werden:

Zunächst lädt man die Nummer der zu adressierenden Speicherstelle in das AL-Register. Dann gibt man diesen Wert mit Hilfe des OUT-Befehls an den Port 70h aus. Dadurch erkennt der Chip, daß nun auf eine seiner Speicherstellen zugegriffen werden soll. Im nächsten Schritt kann man dann wahlweise einen OUT-Befehl auf den Port 71h ausführen, um in die gewünschte Speicherstelle zu schreiben, oder einen IN-Befehl aufrufen, um den Inhalt der Speicherstelle aus dem Port 71h auszulesen.

 

Lesen einer Speicherstelle der Echtzeituhr

Schreiben einer Speicherstelle der Echtzeituhr

         Mov    al, Speicherstelle
           Out    70h, al
         In     al, 71h

                         mov   al, Speicherstelle
                         out     70h, al
                         mov   al, Neuer Inhalt
                         out     71h, al

Die direkte Ausgabe eines Wertes auf einen Port ist nicht möglich, daher der Umweg über das Register AX.

Über den BIOS-Interrupt 1Ah können die verschiedenen Zeit-Funktionen des ROM-BIOS angesprochen werden. Waren es beim PC und XT lediglich zwei Funktionen, so sind es beim AT bereits acht Funktionen, die dem Anwender zur Verfügung stehen. Die erweiterten Funktionen beziehen sich dabei allesamt auf die batterigegepufferte Echtzeituhr (RTC, Real Time Clock), die ab dem AT286 eingeführt wurde und in der Lage ist, die Zeit auch noch nach dem Ausschalten des Rechners weiterzuzählen. Durch diese Uhr hat sich auch die Arbeitsweise der Zeitmessung gegenüber dem PC und XT grundlegend geändert, denn diese berechnen die Zeit mit Hilfe eines Software-Interrupts. Widmen wir uns zunächst der Uhr und den von ihr belegten Speicherzellen.

Speicherstellen der Uhr im batteriegepufferten RAM

Adresse:

Inhalt:

00h

Aktuelle Sekunde der Uhr, Bit 7 nur lesbar

01h

Sekunden der Alarmzeit

02h

Aktuelle Minute

03h

Minuten der Alarmzeit

04h

Aktuelle Stunde (00-23 = 24 Stunden-Anzeige) (01-12 = AM-Anzeige) (81-92 = PM-Anzeige)

05h

Alarmstunde

06h

Tag der Woche (01=Sonntag)

07h

Tage des Monats (01-31)

08h

Monat (01-12)

09h

Jahr (00-99)

0Ah

Statusregister A der Uhr:
Bit 7 Time Update (nur lesbar)
Bit 6-4 Time Base (010b = 32,755 kHz)
Bit 3-0 Interruptrate Selection (0000b = keine, 0011b = 122µs, 0110b = 976,56 µs, 1111b = 500µs)

0Bh

Statusregister B der Uhr:
Bit7 Cycle Update Enable (1)
Bit6 Periodic Interrupt Enable (1)
Bit5 Arlarm Interrupt Enable (1)
Bit4 Update Ended Interrupt Enable (1)
Bit3 Square Wave Output Enable (1)
Bit2 Data Mode, 0: BCD, 1:binär (1)
Bit1 24/12 Hour Selection, 1:24h (1)
Bit0 Daylight Saving Enable (1)

0Ch

Statusregister C der Uhr, nur lesbar:
Bit7 Interrupt Request Flag (IRQ8)
Bit6 Periodic Interrupt Flag
Bit5 Alarm Interrupt Flag
Bit4 Update Ended Flag

0Dh

Statusregister D der Uhr, nur lesbar: Bit7 Battery Good Status (1)

32h

Jahrhundert (19 oder 20)


Wie die Tabelle zeigt, handelt es sich dabei um die Speicherstellen 00h bis 0Dh, sowie die Speicherstelle 32h.
 

Auf jedes der drei Zeitfelder (Sekunde, Minute, Stunde) folgt jeweils ein gleichlautendes Alarmfeld. Mit Hilfe dieser Felder kann eine Alarmzeit (allerdings nur am aktuellen Tag) eingestellt werden, an der dann durch die Uhr ein bestimmter Interrupt ausgelöst wird. Das Feld Tag der Woche gibt die Nummer des aktuellen Wochentags an, wobei der Wert 1 den Sonntag repräsentiert. Der Wert 2 steht für Montag, 3 für Dienstag, 4 für Mittwoch usw. Das Jahr wird relativ zum Jahrhundert angegeben. Der Wert 98 in diesem Feld repräsentiert dadurch z.B. das Jahr 1998, sofern das Jahrhundert mit 19 angegeben wurde. Neben den verschiedenen Informationen, die Datum und Uhrzeit betreffen, finden sich in den batteriegepufferten Speicherstellen zahlreiche Konfigurationsinformationen, die in der nachfolgenden Tabelle aufgelistet sind. Nicht alle Speicherstellen weisen bei den verschiedenen BIOS-Herstellern eine einheitliche Belegung auf, sondern nur jene, die nicht als reserviert gekennzeichnet sind. Alle anderen können von einem BIOS- bzw. Hardware-Hersteller beliebig genutzt werden und sollten deshalb auch nicht von einem Programm überschrieben werden.

Informationen in den batteriegepufferten Speicherstellen der Echtzeituhr

Adresse:

Inhalt:

0Eh

Diagnose-Byte:
Bit7 Batterie der RTC leer
Bit6 Prüfsumme in den Bytes 2Eh und 2Fh ist falsch
Bit5 Konfigurations-Byte ist falsch
Bit4 Angabe der Speichergröße in den Speicherstellen 15h-18h ist falsch
Bit3 Datum oder Zeit in den Registern 00h-09h fehlerhaft

0Fh

Status beim Herunterfahren des Systems (Reset Code)

10h

Diskettenbeschreibung: Bit7-4 Erstes Laufwerk, Bit3-0 Zweites Laufwerk
0h = kein Laufwerk
1h = 360 kB (5.25”)
2h = 1.2 MB (5.25”)
3h = 720 kB (3.5”)
4h = 1.44 MB (3.5”)
5h = 2.88 MB (3.5”)

11h

Art der ersten Festplatte

12h

Art der zweiten Festplatte

13h

Reserviert: PS/2 oder AMI-BIOS Advanced Setup

14h

Konfigurations-Byte:
Bit7-6 Anzahl der Diskettenlaufwerke
Bit5-4 Videomodus beim Systemstart: 00b = reserviert, 01b = CGA/EGA/VGA 40 Spalten
           10b = CGA/EGA/VGA 80 Spalten, 11b = MDA/Hercules 80 Spalten
Bit3   1 = Festplatte oder Controller nicht in Ordnung
Bit1   1 = Mathematischer Koprozessor installiert
Bit0   1 = Kein Diskettenlaufwerk installiert

15h

Lo-Byte der Hauptspeichergröße auf der Hauptplatine in Kbyte

16h

Hi-Byte der Hauptspeichergröße auf der Hauptplatine in KByte

17h

Lo-Byte der Hauptspeichergröße auf einer Zusatzplatine in KByte

18h

Hi-Byte der Hauptspeichergröße auf einer Zusatzplatine in KByte

19h - 2Ch

Reserviert

2Dh

AMI-BIOS: Konfigurationsoptionen:
Bit7 Weitek installiert (1)
Bit6 Floppy drive seek
Bit5 Bootreihenfolge: 0 = C dann A:  1 = A dann C
Bit4 Boot speed: 0 = Low, 1 = High
Bit3 Externer Cash enable(1)
Bit2 Interner Cash enable(1)
Bit1 Fast Gate A20 (1)
Bit0 Turbomodus 1 = an

2Eh

Hi-Byte der Prüfsumme über die Speicherstellen 10h - 2Dh

2Fh

Lo-Byte der Prüfsumme über die Speicherstellen 10h - 2Dh

30h

Lo-Byte der Größe des Erweiterungsspeichers in Kbyte

31h

Hi-Byte der Größe des Erweiterungsspeichers in Kbyte

32h

Die ersten beiden Ziffern des Jahrhunderts in BCD-Notation

33h-3Fh

Reserviert (Verschiedene Funktionen, abhängig von Hersteller und Version)

33h

Informationsflag oder Konfiguration CRC (MSB), PS/2

34h

AMI-BIOS: Shadow RAM und Passwort:
Bit7-6 Passwort: 00b = nein, 01b = ja, 10b = reserviert, 11b = On Boot
Bit5   C8000h Shadow (1)
Bit4   CC000h Shadow (1)
Bit3   D0000h Shadow (1)
Bit2   D4000h Shadow (1)
Bit1   D8000h Shadow (1)
Bit0   DC000h Shadow (1)

35h

AMI-BIOS: Shadow RAM:
Bit7 E0000h Shadow (1)
Bit6 E4000h Shadow (1)
Bit5 E8000h Shadow (1)
Bit4 EC000h Shadow (1)
Bit3 F0000h Shadow (1)
Bit2 C0000h Shadow (1)
Bit1 C4000h Shadow (1)
Bit0 reserviert

36h

Phoenix-Bios: HD2 Typ48 Zylinderanzahl (MSB)

37h

Phoenix-Bios: HD2 Typ48 Kopfanzahl oder Jahundert(Uhr), PS/2

38h-3Dh

AMI-BIOS: Verschlüsseltes Password

39h-3Ch

Phoenix-Bios: HD2 Typ48 (diverse Parameter)

3Eh

AMI-BIOS: Extended CMOS Checksumme (MSB)

3Fh

AMI-BIOS: Extended CMOS Checksumme (LSB)

Ende des Standard-64-Byte-Bereiches. Die folgenden Angaben beziehen sich auf das AMI-HI-Flex-BIOS

40h

Reserviert

41h

Bit7-6 IOR/IOW Wait States
Bit5-4 Wait States 16 Bit DMA
Bit3-2 Wait States 8 Bit DMA
Bit1 EMR – Bit
Bit 0 DMA Clock Source

42h-43h

Reserviert

44h

Bit4 NMI Powerfail
Bit3 NMI Local Timeout

45h

Bit7-6 AT Bus 32 Bit delay
Bit5-4 AT Bus 16 Bit delay
Bit3-2 AT Bus 8 Bit delay
Bit1-0 AT Bus I/O delay

46h

Bit7-6 AT Bus 32 Wait States
Bit5-4 AT Bus 16 Wait States
Bit3-2 AT Bus 8 Wait States
Bit1-0 AT Bus I/O Wait States

47h-50h

Reserviert

51h

Bit7 Bank 0/1 RAS Precharge
Bit6 Bank 0/1 Acces Wait States
Bit5 Bank 0/1 Wait States

52h

Reserviert

53h

Bit7 Bank 2/3 RAS Precharge
Bit6 Bank 2/3 Acces Wait States
Bit5 Bank 2/3 Wait States

Die Reservierten Bereiche werden für Spezielle Funktionen des Boards genutzt

PC-Speicherbereiche:

Der Speicherbereich der PC-Rechner ist in acht Bereiche unterteilt, welche aus Abwärtskompatiblitätsgründen bei allen IBM-Clones gleich aufgebaut sind. Ausgangspunkt der Betrachtung ist ein 8088/8086er-System unter MS-DOS. Die Prozessoren Intel 8088 und Intel 8086 verfügen über einen 20 Bit breiten Adreßbus und können somit 1Mbyte Speicher (von 0h bis FFFFFh) direkt adressieren. Der Datenbus des 8088 besteht im Gegensatz zum 8086, der 16 Bit breit ist, nur aus 8 Datenleitungen. Die Anzahl der internen Datenbusleitungen gibt Auskunft darüber, ob es sich um einen 8-,16-,32- oder 64-Bit Prozessor handelt und kann bei der Betrachtung der MEMORY-MAP getrost vernachlässigt werden.

 

Aufteilung des PC-Speicherbereichs

Adresse:

Anwendung:

00000h-9FFFFh

RAM-Bereich von 0 bis 640Kbyte:
00000h – 0003Ch: Allgemeine und Hardware-Interrupt-Vektoren
00040h – 0007Fh: BIOS-Interrupt-Vektoren
00080h – 000FFh: DOS-Interrupt-Vektoren
00100h – 003FFh: Allgemeine und Hardware-Interrupt-Vektoren
00400h – 004FFh: BIOS-Datenbereich
00500h – 005FFh: DOS-Datenbereich
00600h – 09FFFh: Frei für Programme, konventioneller Speicher

A0000h-AFFFFh
B0000h-B7FFFh
B8000h-BFFFFh
C0000h-C7FFFh
C8000h-C9FFFh
CA000h-DFFFFh
E0000h-EFFFFh
F0000h-FFFFFh
FE000h-FFFFFh

Reserviert für EGA
Monochrom-Adapter oder EGA
Color-Grafik-Adapter
EGA/VGA-BIOS
Festplatten-Controller
Freier Anwenderbereich: RAM, EMS-Fenster oder BIOS von Erweiterungen
Erweitertes System-BIOS ausgelegt als 128k x 8 Flash-Memory oder Erweiterungen
System-BIOS-ROM 64k x 8.
ROM oder EPROM vom Typ 2764

Für Anwender ist der RAM-Bereich von 0 bis 640Kbyte interessant, denn im Betriebszustand ist hier das System-RAM untergebracht. Das System-RAM liegt zwischen der Adresse 0h und 600h und ist in sich nochmal unterteilt. In diesem Bereich befinden sich die I/O-Adressen für die Peripherie der Systemplatine und die Interrupt-Vektoren-Tabellen, die dem PC-BIOS die 256 möglichen Interrupt-Adressen zur Verfügung stellen. Für die Programmierung benötigt man häufig die Adressen für die Datenfelder im BIOS. Besonders interessant ist der Bereich zwischen 4F0h und 4FFh, der durch MS-DOS freigehalten wird.
Dieser Bereich wird von DOS nicht verwaltet oder beschrieben und steht so für die Kommunikation zwischen den Programmen zur Verfügung. Der DOS- und der BASIC-Bereich liegt im Adressraum von 500h bis 5FFh, läßt sich aber ab 600h erweitern. Ab der oberen Grenze des Anwenderbereiches beginnen die Adressen, die für die Bildschirmsteuerung verantwortlich sind. Dabei gilt folgende Einteilung:

Adreßbereich für die Bildschirmsteuerung

Adresse:

Funktionen:

A0000-AFFFF
B0000-B7FFF
B0000-B0FFF
B1000-B7FFF
B8000-BFFFF
B8000-BBFFF
BC000-BFFFF
C0000-C3FFF

EGA-Bildschirm-Puffer
Monochrom-Adapter oder EGA
Monochrom-Bildschirm-Puffer
Reserviert für Bildschirm-Puffer
Adapter für CGA oder EGA
CGA-Puffer
CGA- oder EGA-Bildschirm-Puffer
EGA-BIOS

Diese Bereiche lassen sich für alle Bildschirm-Standards einsetzen und noch entsprechend erweitern. Hersteller von Bildschirmkarten nutzen für die Platine alle Möglichkeiten der Adressierung aus. Ab der Adresse C4000h beginnen die Speichereinheiten für die ROM-Erweiterungen und für ein drittes Disketten-Laufwerk. Zwischen den Adressen C4000h und EFFFF befinden sich die Kundenspezifischen Programme der Hersteller, die in ROM- oder EPROM-Bausteinen untergebracht sind.

 

Adreßbereiche für die Speichereinheiten

Adresse:

Funktion:

C4000-C7FFF
C8000-CCFFF
CD000-CFFFF
D0000-DFFFF
E0000-EFFFF

ROM-Erweiterungen
Disketten-Laufwerk-Erweiterung
Anwender-PROM für I/O-Bereich
Anwender-PROM-Bereich
ROM-Erweiterungen

Damit steht ein Adreßvolumen von 180 Kbyte zur Verfügung, die der Anwender für seine kundenspezifischen Programme einsetzen kann. Auf den einzelnen Erweiterungsplatinen waren früher DIP- oder DIL-Schalter (Mäusepiano) für die Einstellung der Adressen vorhanden und bei der Festlegung der Bereiche muß das Handbuch exakt beachtet werden. Im Bereich von F0000h bis FFFFFh hat man ein volles 64-Kbyte-Segment zur Verfügung, das sich in fünf Funktionen einteilen läßt.

 

Adreßbereich für die Grundfunktionen eines PC-Systems

Adresse:

Funktion:

F0000-FDFFF
E0000-FFFD9
FFFF0-FFFF4
FFFF5-FFFFC
FFFFE-FFFFF

ROM-BASIC
BIOS
Startadresse nach dem Einschalten des PCs
BIOS-Start-Daten
ID-Funktion

Zwischen der Adresse F0000h und FDFFFh liegt der Adreßbereich für das ROM-BASIC, dieser Bereich unterliegt dem Copyright von IBM. Auf den früheren Nachbauten waren deshalb immer vier Leersockel auf der Mutterplatine vorhanden, um die ROM-Bausteine mit dem BASICA unterzubringen. Da diese Bausteine aber nicht auf dem Markt erhältlich sind, entfallen diese Leersockel heute.  Nun sollte unser Wissen ausreichen, um sich weiter mit dem Booten des PCs auseinander zu setzen. Nach dem der POST erfolgreich verlaufen ist wird über den Software-Interrupt 19h der BOOTSTRAP LOADER gestartet. Dieser sucht nach einen gültigen Bootsektor für den Systemstart und jetzt kommt endlich auch das DOS ins Spiel.

 

Der interne Aufbau des DOS

 

DOS setzt sich aus mehreren Komponenten zusammen, die für bestimmte Funktionsbereiche dieses Systems zuständig sind. Die drei wichtigsten Bestandteile sind dabei das DOS-BIOS (nicht zu verwechseln mit dem ROM-BIOS), der DOS-Kern und der Kommandoprozessor, die bereits räumlich voneinander getrennt werden, indem man sie in unterschiedlichen Dateien festhält. Das DOS-BIOS ist in einer Datei untergebracht, die bei IBM-DOS den Namen IBMBIO. SYS und bei MS-DOS den Namen IO.SYS trägt. Diese Datei befindet sich auf jedem PC grundsätzlich als erste Datei im Hauptverzeichnis des Bootlaufwerks und ist mit den Dateiattributen HIDDEN und SYSTEM versehen, damit sie bei Aufruf des DIR-Befehls nicht auf dem Bildschirm erscheint. Sie enthält  die Standard Gerätetreiber für:

              Tastatur und Bildschirm(CON)
              Drucker (PRN) und Serielle Schnittstelle (AUX)
              Bit-Schlucker (NUL)
              Uhr ($CLOCK)
              Diskette und Festplatte (DISK)
               

Wenn DOS mit einem dieser Geräte kommunizieren möchte, greift es auf die in diesem Modul enthaltenen Gerätetreiber zurück, die sich ihrerseits der Routinen des ROM-BIOS bedienen. Weil nur das DOS-BIOS mit der Hardware in Berührung kommt (auch das nur über das ROM-BIOS), ist es neben den installierbaren Gerätetreibern aus der Konfigurationsdatei CONFIG.SYS die hardware-abhängigste Komponente des Betriebssystems. Vor mehreren Jahren, als die Unterschiede zwischen den PCs verschiedener Anbieter noch wesentlich größer waren als heute, musste dieser Teil des DOS deshalb von den verschiedenen Hardwareherstellern angepasst werden. Der DOS-Kern, der so genannte Kernel, ist in der Datei IBMDOS.SYS (bei IBM-DOS) bzw. MSDOS.SYS (bei MS-DOS) enthalten. Sie folgt im Hauptverzeichnis des Bootlaufwerks unmittelbar hinter der Datei IBMBIO.SYS bzw. IO.SYS. Genau wie ihre Vorgängerin ist sie für den Anwender normalerweise nicht sichtbar, weil sie die Dateiattribute SYSTEM und HIDDEN trägt. Gelöscht werden kann sie - genau wie ihre Vorgängerin - auch nicht ohne weiteres, weil sie mit dem Attribut READ-ONLY markiert ist. In dieser Datei sitzen die zahllosen Funktionen des DOS-API, die über den Interrupt 21h erreicht werden können, aber auch die gesamte interne Verwaltung findet hier statt, von der weder Anwender noch Programmierer etwas mitbekommen. Alle Routinen sind hardwareunabhängig formuliert und greifen für den Zugriff auf andere Geräte wie Tastatur, Bildschirm und Diskette auf die Gerätetreiber des DOS-BIOS zurück. Aus diesem Grund muss dieses Modul auch nicht an die Hardware verschiedener Rechner angepasst werden. Im Gegensatz zu den beiden bisher vorgestellten Modulen ist der Kommandoprozessor des DOS, die so genannte SHELL in einer sichtbaren Datei mit dem Namen COMMAND.COM untergebracht. Es ist dieses Programm, das beim Starten des Rechners automatisch aufgerufen wird, das DOS-Prompt A> bzw. C> auf den Bildschirm bringt, und die Eingaben des Anwenders entgegennimmt. Weil er die einzig sichtbare Komponente des DOS darstellt, wird er von vielen Anwendern fälschlicherweise als das eigentliche Betriebssystem betrachtet. In Wirklichkeit ist er aber nur ein ganz normales Programm, das unter der Kontrolle des DOS abläuft. Der Kommandoprozessor ist allerdings kein monolithischer Blick, sondern selbst wieder in drei Module aufgegliedert: einen residenten Teil, einen transienten Teil und die Initialisierungsroutine. Der residente Teil, also der Teil, der ständig im Speicher des Rechners verbleibt, enthält die verschiedenen Interrupt-Handler des DOS. Und deshalb ist auch klar, warum dieser Teil immer im Speicher verbleiben muss, denn sonst ist ein Systemabsturz spätestens beim Aufruf des nächsten Hardware-Interrupts vorprogrammiert, dessen Interrupt-Handler in diesem Teil sitzt. Der transiente Teil enthält den Programmcode zur Ausgabe des Prompts, zum Einlesen der Benutzereingaben von der Tastatur und deren Ausführung. Seinen Namen verdankt dieses Modul der Tatsache, dass es von Anwendungsprogrammen überschreiben werden kann, weil es oberhalb dieser Programme im Speicher angesiedelt ist. Das ist jedoch unerheblich, weil die Programmausführung nach der Beendigung eines Anwendungsprogramms wieder an den residenten Teil übergeben wird. Dieser prüft dann, ob der transiente Teil überschrieben wurde und lädt ihn wieder vom Bootlaufwerk ein, wenn dies der Fall sein sollte. Ist seine Arbeit beendet, wird er nicht mehr gebraucht, und der von ihm belegte RAM-Speicher kann durch ein anderes Programm überschrieben werden.

Die Befehle, die vom Kommandoprozessor entgegengenommen werden, unterteilen sich in die drei Gruppen: interne Befehle, externe Befehle und Batch-Dateien. Erstgenannte sind Befehle, deren Programmcode im transienten Teil des Kommandoprozessors enthalten ist. Beispiele für diese Kategorie von Befehlen sind die Befehle COPY, REN und DIR. Beim Aufruf dieser Befehle muss der Kommandoprozessor also kein Programm nachladen, sondern führt diese Befehle als Unterprogramme im Speicher aus. Im Gegensatz zu diesen Befehlen sind die externen Befehle nicht Teil des Kommandoprozessors und deshalb in einer Programmdatei auf Diskette oder Festplatte gespeichert. Sie müssen vor ihrer Ausführung deshalb in den Speicher geladen werden. Beispiele dafür sind der FORMAT- und der CHKDSK-Befehl. Nach ihrer Ausführung wird der von ihnen belegte RAM-Speicher zur weiteren Verwendung durch andere Programme freigegeben und kann dadurch überschrieben werden. Unter einer Batch-Datei versteht man eine Textdatei, in der Zeile für Zeile die Namen von auszuführenden Programmen oder DOS-Befehlen aufgeführt werden. Beim Aufruf einer Batch-Datei wird sie geladen und durch den so genannten Batch-Interpreter im transienten Teil des Kommandoprozessors abgearbeitet. Jede eingelesene Zeile wird dabei so behandelt, als ob der Anwender sie soeben selbst auf der DOS-Kommandoebene eingegeben hätte.

Die bekannteste Batch-Datei ist sicherlich die Datei AUTOEXEC.BAT, die vom DOS unmittelbar nach dem Booten aufgerufen und ausgeführt wird. Wie bei der manuellen Eingabe von Befehlen wird die Eingabe zunächst einmal daraufhin untersucht, ob es sich um einen internen oder externen DOS-Befehl bzw. um einen der verschiedenen Batch-Befehle handelt, die nur in Batch-Dateien angegeben werden dürfen. Handelt es sich um einen internen DOS-Befehl, kann er sofort ausgeführt werden, da sich sein Code bereits im Speicher befindet. Handelt es sich hingegen um einen externen Befehl oder um eine Batch-Datei, wird zunächst im aktuellen Directory nach einer Datei mit dem angegebenen Namen gesucht. Wird in diesem Directory keine derartige Datei entdeckt, dann wird der Reihenfolge nach in allen Verzeichnissen gesucht, die über den PATH-Befehl als zusätzlich zu durchsuchende Verzeichnisse festgelegt wurden. Es werden bei der Suche allerdings nur Dateien in Betracht gezogen, die mit der Erweiterung .COM, .EXE oder .BAT versehen sind.

Da der Kommandoprozessor nicht nach allen drei Erweiterungen gleichzeitig suchen kann, wird zunächst nach .COM-, dann nach .EXE- und schließlich nach BAT-Dateien gesucht. Bleibt die Suche erfolglos, wird eine Fehlermeldung auf dem Bildschirm ausgegeben und neue Eingaben werden erwartet.

 

 

Booten des DOS

Das Zusammenspiel zwischen dem DOS-BIOS, dem Kernel und dem Kommandoprozessor, setzt natürlich voraus, dass sich diese Programme im Speicher befinden. Dazu müssen sie jedoch erst einmal eingeladen und dort verankert werden. Das geschieht während des Bootsvorgangs, der jetzt unter die Lupe genommen wird. Der Bootsvorgang des DOS beginnt mit dem Versuch des ROM-BIOS, einen so genannten Boot-Sektor zu lokalisieren. Denn es ist das ROM-BIOS, das nach dem Start des Rechners zur Ausführung gebracht wird und sich selbst initialisiert, bevor es das Einladen des Betriebssystems bewirkt. Hat es solch einen Sektor auf der Festplatte oder auf der Diskette im Diskettenlaufwerk entdeckt, wird dieser geladen und mit der Ausführung der in ihm enthalten Boot-Routine begonnen. Sie vergewissert sich zunächst, dass es sich bei den ersten beiden Dateien auf dem Bootmedium um die Dateien IBMBIO.SYS und IBMDOS.COM bzw. IO.SYS und MSDOS.SYS handelt. Ist dies nicht der Fall, kann DOS nicht gebootet werden, und der Anwender wird durch eine Bildschirmmeldung darauf aufmerksam gemacht. Sind die beiden Dateien jedoch vorhanden, werden sie beide in den Speicher geladen und die Programmausführung mit der ersten der beiden fortgesetzt. Dadurch kommt die Initialisierungsroutine zur Ausführung, die sich zunächst an das Ende des RAM-Speichers kopiert, von wo aus sie die weitere Initialisierung des Systems steuert. Im nächsten Schritt wird der DOS-Kern, der mit der Datei IBMDOS.SYS bzw. MSDOS.SYS bereits geladen wurde, an seine endgültige Lage im Speicher  verschoben. Dann ruft die Initialisierungsroutine eine Routine innerhalb des DOS-Kerns auf, die die Initialisierung dieses Moduls vornimmt. Sie legt dabei nicht nur einige wichtige Tabellen und Datenbereiche an, sondern ruft auch die Initialisierungsroutinen der einzelnen Gerätetreiber auf, die mit der Datei IBMBIO.SYS bzw. IO.SYS geladen worden sind. Die Initialisierung des DOS-Kerns ist damit abgeschlossen, alle Funktionen des DOS-API stehen zur Verfügung und deshalb kann jetzt mit der Suche nach der Konfigurationsdatei CONFIG.SYS begonnen werden. Wird diese Datei gefunden, so wird sie geladen und ausgewertet. Das System wird auf diese Weise konfiguriert und mit weiteren Gerätetreibern versehen, die sich zu den internen Gerätetreibern des DOS gesellen. Als letzter Schritt wird dann schließlich der Kommandoprozessor geladen und die Kontrolle aller weiteren Abläufe an ihn übergeben. Damit ist der Boot-Vorgang beendet, und die Initialisierungsroutine verbleibt als Datenmüll solange im Speicher, bis sie von einem anderen Programm überschrieben wird.
 

[Home] [Netzwerktechnik] [Webservice] [PC-Service] [Aufgebohrt] [Kontakt] [AGB] [Impressum]