DOS
Vorab möchte ich zum besseren Verständnis für die folgenden Ausführungen kurz auf ein (historisch bedingtes) Manko des Betriebssystems DOS hinweisen.
Im Gegensatz zu den Prozessoren der 68000 -er Reihe, der in den Atari ST/TT und in den "Mac's" arbeitet, können die PC-Prozessoren der 80x86 -er Reihe (im Real- und protected-Mode) den Speicher nicht "am Stück" (linear) ansprechen.
Vielmehr wird der Speicher in "64 KB - Häppchen" zerlegt. Diese sogenannte "Segmentierung" hat ihre Ursache in der Prozessorarchitektur, nach der der Speicher nur über die voneinander getrennten Segment- und Offsetregister angesprochen werden kann. Beide Registersätze sind im Real-Mode (DOS) nur 16 bit breit, wobei sich die "Hausnummer" im Speicher aus dem 16-fachen des Inhalts des Segmentregisters plus dem Wert des Offsetregisters zusammensetzt.
Die (hexadezimale!) Adresse 0080:0020 wird also wie folgt addiert:
0080 0020 ----- 00820
Damit sieht man schon den maximalen Speicherbereich, den der Prozessor im Real-Mode ansprechen kann:
Von 0000:0000 bis FFFF:FFFF 0000 FFFF 0000 FFFF ----- ------ 00000 10FFEF (=1.114.095 Bytes = 1 MB + 65519 Bytes)
Aus verschiedenen Gründen hat man den DOS-Speicher im PC im allgemeinen folgendermaßen eingeteilt:
Segment: | Adresse: | Verwendung: |
16 | FFFF:0010 - FFFF:FFFF | HMA (High Memory Area) |
15 | F000:0000 - F000:FFFF | UMB 6 BIOS |
14 | E000:0000 - E000:FFFF | UMB 5 meist frei |
13 | D000:0000 - D000:FFFF | UMB 4 meist frei |
12 | C000:0000 - C000:FFFF | UMB 3 meist frei |
11 | B000:0000 - B000:FFFF | UMB 2 Video-RAM, B000:0000-B7FF:000F meist frei |
10 | A000:0000 - A000:FFFF | UMB 1 meist von der VGA-Karte benutzt |
09 | 9000:0000 - 9000:FFFF | DOS-Speicher, frei |
08 | 8000:0000 - 8000:FFFF | DOS-Speicher, frei |
07 | 7000:0000 - 7000:FFFF | DOS-Speicher, frei |
06 | 6000:0000 - 6000:FFFF | DOS-Speicher, frei |
05 | 5000:0000 - 5000:FFFF | DOS-Speicher, frei |
04 | 4000:0000 - 4000:FFFF | DOS-Speicher, frei |
03 | 3000:0000 - 3000:FFFF | DOS-Speicher, frei |
02 | 2000:0000 - 2000:FFFF | DOS-Speicher, frei |
01 | 1000:0000 - 1000:FFFF | DOS-Speicher, frei |
00 | 0000:0000 - 0000:FFFF | DOS-Speicher, im unteren Teil von Systemvariablen belegt |
Im protected-Mode (WINDOWS 3.xx, einige DOS-Programme) bleibt die oben beschriebene Segmentierung erhalten, im Gegensatz zum Real-Mode sind die Segmentregister jedoch breit genug, um (theoretisch) 4 GB Speicher zu adressieren.
Erst im "flat memory model" (Linux, WINDOWS NT, WINDOWS 9x, OS/2, ab 80386) haben die Offsetregister eine Breite von 32 bit (daher der Ausdruck "32-bit-Betriebssystem") und können damit auf den gesamten (realen und virtuellen) Speicher wie die 68000 -er "am Stück" zugreifen.
Ein "nacktes" DOS setzt sich aus den folgenden Bestandteilen zusammen:
|
Hier sind noch ein paar Tips, die das Leben mit DOS erleichtern können:
- Chronischer Speicherplatzmangel unter DOS?
Lade die unvermeidlichen Treiber mit
LH (=LoadHigh in der "AUTOEXEC.BAT") oder mit
DEVICEHIGH
(in der "CONFIG.SYS") über den wertvollen 640k - DOS - Speicher in die sogenannten "UMB's".
Das Kommando
DEVICE=\DOS\EMM386.EXE NOEMS
in der CONFIG.SYS bereitet den Speicher darauf vor.
- Alle UMB's voll?
Dann kitzeln wir mit
DEVICE=\DOS\EMM386.EXE NOEMS I=B000-B7FF
noch einmal 32 KB zusätzlich heraus.
Der Trick: Der Speicherbereich B000:0000 bis B7FF:000F ist für monochrome Grafikkarten reserviert und steht bei den heute üblichen (farbigen) VGA-Karten praktisch immer zur Verfügung.
Mit der Option HIGHSCAN kann man dann versuchen, Speicher zu nutzen, der in dem für das BIOS reservierten Speicherbereich (ab F000) liegt.
Der HIMEM checkt beim Start immer den gesamten Speicher durch. Das kann bei einem 64 MB-Speicher ganz schön lästig werden. Der optionale Parameter
/TESTMEM:OFF
verhindert den Speichertest. Gilt ab DOS 6.2
Der Anfang einer CONFIG.SYS sollte daher etwa wie folgt aussehen:DEVICE=\DOS\HIMEM.SYS /TESTMEM:OFF DEVICE=\DOS\EMM386.EXE NOEMS HIGHSCAN I=B000-B7FF DOS=HIGH,UMB DEVICEHIGH=.......
- Den LASTDRIVE=... nicht gerade auf "Z" stellen, das kostet sinnlos viele viele Bytes. Außerdem ist dieser Befehl
nur dann sinnvoll, wenn mindestens ein Laufwerk "F" vorkommt.
- Zur AUTOEXEC.BAT:
- Lade zuerst alle Treiber mit
LH ....
in den Speicher und erst ganz am Schluß ....
- die Umgebungsvariablen:
SET TEMP=C:\TEMP
SET TMP=C:\TEMP
SET DIRCMD="/a/p/oe - den Suchpfad
PATH C:\;C:\WINDOWS - und den ultimativen Prompt
PROMPT $e[s$e[f$e[1;33;44m$d$e[30;47m $e[1;33;44m$t$h$h$h$e[30;47m $e[1;33;44m$p$e[0;30;47m$e[K$e[u$g
Das spart noch einmal eine ganze Menge ein.