Wie kommen die max 1mb adressierbarer Speicher im real mode zu stande?
-
Hallo!
Physisch sind ja max. 1mb zu addressieren! Aber wie kann das sein? Ich kann doch von 0x0000:0x0000 bis 0xFFFF:0xFFFF adressieren! Das ist aber wesentlich mehr! Das sind 4GB! 1mb würde nur zustande kommen wenn man 0x0000:0x0010 bis 0xFFFF:0x0010 gehen würde!Hoffentlich klärt mich jemand auf
Kevin
-
hi.
Im RM wird die physische Speicheraddresse wie folgt berechnet:
Segment/1000h+offset.Frag mich nicht warum, ist aber so. (sind schliesslich nur 20 Addressleitungen)
-
hmm??? wie kommst du denn auf diese formel??? die ist mit sicherheit falsch! die adresse wird wie folgt berechnet
adresse = segment * 16 + offset
also z.B.
Offset 1000
Segment 1234
Adresse 13340und das würde nach deiner rechnung nicht rauskommen!
cu todo
-
*schaem*
-
Völlig richtig von todo. Das Segmentregister hat ja 16 Bit. Durch das multiplizieren mit 16 werden die Bits um vier Positionen nach links verschoben. Dadurch ergeben sich 20 Bits (Adressleitungen). 2^20 sind ein MB.
-
2^20 Bytes sind ein MiB, also etwas mehr als ein MB. Im übrigen kann man im Real-Mode sogar mehr als 2^20 Bytes ansprechen, nämlich 2^20 + 2^16 - 2^4.
<edit>Wortdreher</edit>[ Dieser Beitrag wurde am 11.03.2003 um 01:25 Uhr von SG1 editiert. ]
-
Original erstellt von SG1:
**2^20 Bytes sind ein MiB, also etwas mehr als ein MB. Im übrigen kann man im Real-Mode sogar mehr als 2^20 Bytes ansprechen, nämlich 2^20 + 2^16 - 2^4.
<edit>Wortdreher</edit>
**<nitpick>Nur auf einem 80286 oder höher und mit eingeschaltetem A20</nitpick>
-
was heißt hier "Nur auf einem 286 oder höher"??? niemand programmiert heute mehr ernsthaft für vorgänger des 386, oder??? außerdem ist das Einschalten der A20 kein problem, sind nur ein paar outs an den tastatur-controller (hab gerade keinen code da - is ja auch nicht gefragt)
cu todo
-
Original erstellt von todo:
was heißt hier "Nur auf einem 286 oder höher"??? niemand programmiert heute mehr ernsthaft für vorgänger des 386, oder???deswegen <nitpick>
**
"außerdem ist das Einschalten der A20 kein problem, sind nur ein paar outs an den tastatur-controller "**Also himem.sys hat um die 20 verschiedene Möglichkeiten implementiert gehabt für rund 20 verschiedene Keysboard-Controller
-
Original erstellt von SG1:
**2^20 Bytes sind ein MiB, also etwas mehr als ein MB. Im übrigen kann man im Real-Mode sogar mehr als 2^20 Bytes ansprechen, nämlich 2^20 + 2^16 - 2^4.
<edit>Wortdreher</edit>[ Dieser Beitrag wurde am 11.03.2003 um 01:25 Uhr von [qb]SG1** editiert. ][/QB]
Was ist denn ein MiB?
-
2^20 Bytes
-
@TriPhoenix: was HiMem.Sys angeht: muss ja auch kompatibel zu ALLEN kbd-controllern sein, wo von die meisten Uralt sind (als z.b. Non-MFII) und nirgendsmehr verwendet werden. is ja aber letzendlich auch egal
cu todo
-
ein mb == 1024 kb, ein kb == 1024 byte.
2^20 == 1024 * 1024 == MB
was auch immer dein mib ist, es ist ein mb, wenn es 2^20 ist.wenn ich 20 adressleitungen hab, dann ist die maximale adresse die ich drauf legen kann 2^20. also ein mb. um mehr drauf zu legen brauch ich unweigerlich eine weiter adressleitung. => ohne a20 (das nach meinen infos, die 21. adressleitung einschaltet symbolisiert) dürfte man also 0xFFFF:0xFFFF nicht scheiben können. man kann scheinbar doch. oder?
-
Der Speicherbereich ueber FFFF:0010 (hui, hoffentlich hab ich mich hier nicht schon wieder vertan
) wird bei ausgeschalteter A20 wieder zum Anfang des Speichers, also 0000:0000 gemapt.
-
Und wie kann man dann testen ob man im A20 "Mode" ist?
-
Die einfachste Methode wird wohl sein, Du schreibst was nach FFFF:0010 und guckst, ob sich bei 0000:0000 was aendert.
-
Ehrlich gesagt bin ich gerade ein wenig überfragt ob FFFF:0010 wirklich gleich 0000:0000 ist. Dennoch sollte die Methode von Nobuo_T sicherlich nur mit Vorsicht benutzt werden, denn 0000:0000 enthält ja den Vektor von Interrupt 0. Da wäre ein vorheriges Sichern angebracht und ein CLI kann auch nicht schaden (ich weiß gerade nicht wozu INT 0 gut ist).
-
Int 0 zeigt auf den Handler der Exception 0 (im PM sowie im RM)
Das der Speicherinhalt an dieser Addresse vor dem Test gesichert werden sollte, versteht sich denke ich von selbst.
Ansonsten ist ein cli o.ae. ueberfluessig.
Nach moeglichkeit sollten aber Divisionen (vor allem durch 0) vermieden werden.
[ Dieser Beitrag wurde am 04.05.2003 um 14:50 Uhr von Nobuo T editiert. ]
-
Original erstellt von <mastamind>:
ein mb == 1024 kb, ein kb == 1024 byte.
2^20 == 1024 * 1024 == MB
was auch immer dein mib ist, es ist ein mb, wenn es 2^20 ist.Durch das Wiederholen von falschen Behauptungen werden diese auch nicht richtiger.
Kilo-, Mega-, Giga-, etc. sind die Si-Präfixe für Potenzen von 10 (10^3, 10^6, 10^9). In der Vergangenheit war es leider so, dass diese (hauptsächlich in der IT-Brance) für Potenzen von 2 (2^10, 2^20, 2^30) missbraucht wurden. Deshalb wurden 1998 die Präfixe KiBi, MeBi, GiBi (abgekürzt Ki, Mi, Gi) für genau diesen Zweck eingeführt. Nachzulesen unter http://physics.nist.gov/cuu/Units/binary.html oder gleich unter "IEC 60027-2, Second edition, 2000-11, Letter symbols to be used in electrical technology - Part 2: Telecommunications and electronics"
<edit>es gibt keine falschen Tatsachen, nur falsche Behauptungen
Zitat ergänzt</edit>[ Dieser Beitrag wurde am 04.05.2003 um 19:53 Uhr von SG1 editiert. ]
-
danke für diese wertvolle information