|
|
|
|
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.
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:
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.
|
|