Adressierung im RM
-
- 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