Ansicht umschalten
Avatar von Lindwurm
  • Lindwurm

mehr als 1000 Beiträge seit 19.07.2001

Der Segment : Offset Wahnsinn

Hier nochmal der Segment:Offset Wahnsinn etwas ausführlicher:

Ein besonders Feature des 8086/88 war sein Adressiermodell mit
Segment und Offset, das mit 16 Bit Adreß- und 16 Bit
Segment-Registern mehr physischen Speicher direkt addressieren konnte
als die damaligen 8 Bitter (Z80, 8085).

Verglichen mit den damaligen 8 Bittern und deren extern drangebauten
propritären "Bankswitching" Logiken (zur Adressierung von mehr als 64
KiB) war der 8086/88 durchaus innovativ, verglichen mit dem 68000
aber rückständig. 

Die physische Adresse des 8086/88 wurde aus:

Physische Adresse = (Segmentadresse*16) + Offsetadresse

gebildet, was einen physischen Adreßraum von insgesamt(1MiB+65520
Bytes) ermöglichte. Da der 8086/88 aber nur über 20 Adreßleitungen
verfügte (für mehr waren auf dem damals populären 40 poligen
DIP-Gehäuse kein Platz) waren die oberen 65520 Bytes auf diesem
Prozessor nicht addressierbar sondern wurden durch den 
"Adreß-Wraparound" wieder beginnend ab Adresse 0 eingeblendet 
(gespiegelt"). Das nutzten manche DOS- Versionen aus um
Speicherplatz zu sparen.

Erst der 80286 erlaubte den Zugriff auf die obersten 65520 Bytes des
"Real Mode" Adreßraums. Dieser Speicherbereich wurde auch als HMA
("High Memory Area") bezeichnet. Um den Adreß-Wraparound auch auf dem
80286 zu ermöglichen (Zur Kompatibilität mit älteren DOS-Versionen)
wurde das "A20 Gate" ins Leben gerufen das in der Lage war die
physische Adreßleitung A20 des 80286 auf den Wert "0" festzulegen.
Das A20 Gate war ursprünglich nicht Bestandteil des Prozessors 
sondern des Chipsatzes bzw. der Mainboard-Logik.

Hätte Intel "damals" den Segment:Offset Versatz auf 8 Bit anstatt von
4 Bit "Paragraphen" eingestellt, also:

Physische Adresse = (Segmentadresse*256) + Offsetadresse

dann wäre bereits der 8086 in der Lage gewesen theoretisch 16 MiB zu
adressieren. Beim DIP40-Gehäuse hätte Intel dann dann anstatt der
Adressleitung A19 die Adreßleitung A23 herausführen müssen. Der
Original 8086/88 wäre dann in der Lage gewesen die untersten 576 KiB
(512KiB+64KiB-256Bytes um genau zu sein) und die obersten 512 KiB 
des 16 MiB Adreßraums anzusprechen. 

Bei einem PLCC44-Gehäuse hätte man dann auch die fehlenden Adreßpins
A20 bis A22 herausführen können und wäre so in der Lage gewesen im
Real Mode die vollen 16 MBiB zu adressieren. Den 16 Bit Protected
Mode hätte man dann überhaupt nicht benötigt sondern hätte beim 80386
direkt auf lineare Adressierung plus MMU wechseln können (und hätte
damit mit dem 68030 gleichgezogen).

Der größte Nachteil dieser segmentierten Adressierung bestand darin
daß zusammenhängende Datenobjekte (z.B. Arrays) größer 64KiB nicht
linear addressierbar waren. Um größere Datenstrukturen zu
addressieren mußte man auf Segment:Offsetregister Arithmetik
zurückgreifen was von Intel ursprünglich sogar nicht erlaubt war. Die
64 KByte Grenze galt weiterhin auch für den 16 Bit Prozessor, weshalb
auch dort Klimmzüge mit Segmentregistern notwendig waren um
Datenobjekte größer 64 KByte zu verwalten. 

Erst der 80386DX/SX räumte mit diesen Beschränkungen auf.

Mittlerweile alles Schnee von gestern ...

Bewerten
- +
Ansicht umschalten