Adressierung im RM
-
Um es gleich vorweg zu nehemen, ich habe das Tutorial zur Adressiserung bereits gelesen! Ich habe aber trotzdem einige Fragen:
- Ab welchem Zeitpunkt werden in der CPU 20-Bit-Adressen gebildet? Ab dem Start der CPU oder ab der Aktivierung der A-20?
- ZB. 0A00:0000 und 0000:A000 zeigen beide auf die selbe Adresse (0A000). Wieso liegt die selbe Adresse in verschiedenen Segmenten?
- Auf welche Adresse zeigt zB diese Kombination: FFFF:FFFF?
lg, phreaking
-
Ok.
Zu1:
Die A20 ist beim Booten des Systems abgeschaltet. Das OS muss sie erst einschalten. => Anfangs stehen nur 19 Addr.-Leitungen zur Verfuegung.Zu2:
Die Segmente im RM darfst Du dir nicht wie totale Speichergrenzen zwischen Segmenten wie im PM vorstellen. Das Segmentregister dient im RM mit seinen letzten 4 Bit einfach mit als zusaetzlicher Adress-Teil.
Wie Du im Tut sicherlich gelesen hast, berechnet sich eine physische Addr. im RM wie folgt:
Addr.=Seg*16+Offs
Was ist dann bitte an dieser einfachen Gleichung so schwer zu verstehen?
0A000=0A00*10+0=0000*10+A000Zu3:
Das laesst sich auch ganz einfach nach der oben genannten Formel ausrechnen:
FFFF*10+FFFF=10FFEF
Um dieses letzte 64K-Segment addressieren zu koennen braucht man 21Bit => A20 muss aktiviert sein.So, hoffe, das hat alles genuegend erklaert
[ Dieser Beitrag wurde am 19.08.2002 um 15:15 Uhr von Nobuo T editiert. ]
-
Über die dritte Möglichkeit lassen sich die berüchtigten zusätzlichen fast-64k aus dem System quetschen, auch bekannt als HMA
-
Danke für die Antworten. Auch wenn ihr mich für dumm haltet, ich habe noch immer nicht alles verstanden...
- Heißt daß, anfangs werden die Adressen nicht mittels Segment und Offset gebildet? Wie setzt sich denn ein 19-Bit-Adresse zusammen?
- Die Formel habe ich schon richtig verstanden (und auch angewandt), doch es hat mich einfach verwirrt, dass man aus mehreren Segmenten heraus auf die selbe physikalische Adresse zugreifen kann...
- Ich hatte auch bei diesem Beispiel diese Formel angewandt, aber es ist mir nicht klar, wie die 24-Bit-Adresse 10FFEF über eine 20-Bit-Leitung geschickt werden kann? Was ist fast-64k bzw. HMA?
lg, phreaking
-
Och noe, um wirklich fuer doof gehalten zu werden musst Du dich noch a bissel mehr anstrengen
Die sache mit der A20 ist wirklich ein bissel vertrackt und eigentlich mal wieder nur wegen der Dummheit einiger Konstruktoere bei Intel entstanden...
Ok, jetzt gibts ne kleine Geschichtsstunde:
Bei ihrem 8088-CPUs hatte Intel nur 20 Addressleitungen. Damit kann man genau einen Megabyte addressieren, dh. alles bis zur physischen addr. FFFFF. Wenn man das aber wieder zu Segment:Offs. umrechnet ergibt sich ein kleines Prob:
FFFFF=>FFFF:000F
Wie man sieht, liesse sich theoretisch mit dieser Seg:Offs noch knapp ein weiteres Segment addressieren, das geht aber natuerlich net, weil nicht genug addressleitungen vorhanden sind.
Und wie loesen die klugen Koepfe bei Intel dieses Problem?
Ganz simpel: wenn ueber FFFFF addressiert wird, wird einfach
der 21. Addressbit ignoriert und so zu 00000 zurueckgesprungen. (100000 wird zu 00000)Einige Programmierer fanden dieses memory-"feature" nun wohl so toll, dass sie so oft wie moeglich ueber diesen Umweg addressieren wollten und so ergab sich mit Erscheinen des 286, der nun 24Addressleitungen hatte ein neues Problem: Wenn Speicher ueber FFFF:000F angesprochen wird, kann dieser mit den zusaetzlichen Addressleitungen auch tatsaechlich erreicht werden und so kamen die ganzen alten Programme fuer die 8088-CPU a bissel durcheinander, da nicht mehr zu 00000 zurueckgesprungen wurde
Um nun den 286 100%ig 8088-kompatibel zu machen, musste dieses Speicherumsprung-Feature wieder her => die A20 war geboren.
Damit wird dann einfach die 21. Adressleitung abgeschaltet, so dass sich alle neueren CPUs im Realmode wie ein 8088 verhalten.Dh. die A20 steuert im RM nur die Moeglichkeit auf die HMA zuzugreifen, der Speicherbereich ueber FFFFF.
Im PM muss die A20 natuerlich auch eingeschaltet sein, da sonst ein uebles chaos droht, wenn man versucht einen Speicherbereich, der die 21. Addressleitung benoetigt anzusprechen.
PS: hab gerade gesehen, dass ich in meinem letzten posting ein Bit uebersehen habe :p
um 10FFEF addressieren zu koennen werden 21Bit benoetigt.
Bitte dies zu entschuldigen.
-
Danke! Jetzt ist mir ziemlich viel klar. Trotzdem noch einige Fragen:
- Im RM können also immer nur höchstens 21 Adressleitungen genützt werden?
- Wenn A20 deaktiviert ist, ist die 10FFEF, wenn A20 aktiviert ist, dann ist das FFFFF, oder?
- Wie ist das mit den 19-Bit-Adressen?
thx, phreaking
-
- Im RM können also immer nur höchstens 21 Adressleitungen genützt werden?
Liegt nicht an den Adressleitungen, aber weil Segment+Offset 16-Bit-Zahlen sind und Intel die gewählte Adressierungsart vornahm, ist die höchste erreichbare Adresse nunmal 0x10FFEF, mehr als 0xffff geht nunmal net in 16-bit-register
- Wenn A20 deaktiviert ist, ist die 10FFEF, wenn A20 aktiviert ist, dann ist das FFFFF, oder?
Interessant sind Adressen wie ffff:ffff z.B. Die Adressierungsart würde eine SPeicheradresse von 0x10FFEF ergeben, wenn A20 aus ist, lässt du einfach die 1 am Anfang weg. ffff:ffff ist also mit A20 die Adresse 0x10FFEF und ohne A20 0xFFEF.- Wie ist das mit den 19-Bit-Adressen?
Alle Adressen die kleiner 0x10000 sind, werden vom A20 nicht berührt. Im allgeminen Kann man sagen:
Physikalische Adresse mit A20 = Segment * 16 + Offset
Physikalische Adresse ohne A20 = (Segment * 16 + Offset) & 0x0ffffHoffe das hilft
[ Dieser Beitrag wurde am 19.08.2002 um 20:24 Uhr von TriPhoenix editiert. ]
-
Hmm.. das mit den 19-Bit-Adressen kapiere ich noch immer noch nicht!
Warum wird die A20 eigentlich über den Keyboard-Controller aktiviert? Kann man die A20 auch auf einem anderen Weg aktivieren?
Warum muss für den PM auch die A20 aktiviert sein? Ich dachte, im PM kann man höhere Adressen ansprechen!?thx, phreaking
-
Wo siehst Du hier 19Bit Addressen?
Im RM ohne A20 stehen praktisch 20Bit fuer physische Addressierung zur Verfuegung, mit A20 sind es 21Bit.Der Intel KB-controller hatte nunmal noch einen ungenutzen Pin frei, warum sollte man da nicht solchen Schnickschnack, wie die A20 ranlegen?
Aber mitlerweile gibt es tatsaechlich auch die Moeglichkeit, die A20 ohne KB-Controller zu steuern. Das ganze nennt sich dann Fast Gate A20. Wird ueber Port 92h gesteuert (Bit 1: 0=A20 Aus 1=A20 an)Das A20 Gate steuert die 21. Addressleitung. Wenn A20 aus ist und im PM versucht wird zb. 00010000 anzusprechen, wird diese Addresse auch zu 00000000 konvertiert. Genauso wird 00030000 zu 00020000 usw. Bit 21 wird einfach immer ignoriert. Das kann wie man sieht zu nicht unerheblichen Programmfehlern fuehren
Insgesamt kann ohne die A20 nur noch die haelfte des Erweiterungsspeichers angesprochen werden: nur geraden Megabyte-Addressen (0MB 2MB 4MB usw.)
-
Danke!
Hier:Original erstellt von Nobuo T:
**Ok.Zu1:
Die A20 ist beim Booten des Systems abgeschaltet. Das OS muss sie erst einschalten. => Anfangs stehen nur 19 Addr.-Leitungen zur Verfuegung.
...
**19-Address-Leitungen -> 19-Bit-Adressen, oder?
lg, phreaking
[ Dieser Beitrag wurde am 19.08.2002 um 22:47 Uhr von phreaking editiert. ]
-
*ARGL* Sry, ich finde den Begriff A20 nunmal auch etwas verwirrend.
Am Schluss hab ich schon ein Bit uebergangen und dort halt nochmal
-
Ok! Nur noch eine letzte Frage: welche Methode würdest du mir zu steuern der A20 empfehelen?
lg, phreaking
-
Hm... Das ist von PC zu PC unterschiedlich, ob sich die A20 nun ueber Port 92, den KB-Controller, eine BIOS Funktion, o.ae. steuern laesst.
Am sichersten ist es aber vermutlich, das ueber den KB-Controller zu machen.Hier ein Bsp-Code: (ungetestet)
call KB_Wait
mov al,0D1h
out 64h,al
call KB_Wait
mov al,0DFh
out 60h,al
call KB_Wait
...KB_Wait:
in al,64h
test al,02h
jnz Short KB_Wait
retansonsten: int 15h ax=2400h um A20 abzuschalten und int 15h ax=2401h um A20 einzuschalten.
-
Ich lese gerade malfunctions Tutorial, welches ebenfalls ein Kapitel über die Adressierung im RM enthält. Folgende Aussage verstehe ich nicht:
Für die Segmente und Offsets gilt folgendes:
Segment = Offset * 16
Offset = Segment / 16Kann mir das jemand etwas genauer erklären?
lg, phreaking
-
Hat das ausser mir noch nie jemand gelesen?
-
Doch... Ich wollte eigentlich Malfunction selbst die Moeglichkeit lassen, zu antworten... Aber wer nicht will...
Ich vermute mal, die Rechnung ist ein bisschen falsch herum...
So ist das vielleicht sinnvoller:
Segment = Offset / 16
Offset = Segment * 16Dann wuerde die Rechnung erklaeren, wie man ein Offset so umrechnet, dass sich die Addresse, die vorher im Offset stand nun ueber das Segment ansprechen laesst...
Bsp:
Offset / 16 = Segment
1000h / 10h = 0100h
entspricht:
Offset = Segment * 16
1000h = 0100h * 16