Modii und Adressbereichsfrage.



  • Hallo und guten Tag.

    Ich weiß, dass ist jetzt vielleicht eine Frage für google, aber ich kappiers einfach nicht. Ich brauche individuelle Hilfe, und wer könnte das besser als Ihr;)

    Also:
    Bis zum 80286 konnte man nur 1MB Adressraum benutzen, in welchem man weitere 64kB Segmente anlegen kann. So, ab dem dem 80386 Prozessor gab es dann einen 24Bit Adressbus, womit dann der Adressbereich auf 2^24 = 16MB anstieg. Die Register aber, also die im 386 waren aber noch 16Bit Register, sodass man wiederrum nur 64kB Segmente haben konnte(2^16=64kB)(sog. 64k Grenze).
    1.) Frage:
    Ist das so alles richtig?

    Kommen wir zum sog. "real Mode":
    In meinem Buch steht das real mode bedeutet, und das wurde erst später so bezeichnet, einen max. Speicherbereich bestehend aus der Größe 1Mb zu besitzen.
    Jetzt versteh ich nicht ganz was das mit den Größen auf sich hat?!
    Was ist denn jetzt, wenn ich einen Arbeitsspeicher von 2MB habe und ein real mode programm ausführe, bzw. ein real mode OS wie dos z.B.? Heißt das jetzt, ich kann nur 1MB von den 2MB nutzten? Also nur den ersten MB? Im Segmentteil von 0000 -> ffff
    Ich kann ja nichts anderes machen. Wenn ich z.B nur 4 Hex Stellen für den Segment(XXXX:xxxx) Teil habe und dieser mit 16 multipliziert wird, dann kommt man eben nur auf diese 1MB, aber was ist mit dem 2ten MB?

    Ich hätte da dann noch Fragen zu protected und virtual Mode, aber vielleicht erübrigt sich das dann.

    Ich danke schon einmal.
    Gruß
    Alex



  • DeineMutter schrieb:

    Bis zum 80286 konnte man nur 1MB Adressraum benutzen, in welchem man weitere 64kB Segmente anlegen kann.

    Du kannst in dem Sinne keine Segmente anlegen. Die sind fest gegeben durch die Adressbildung im realmode.

    So, ab dem dem 80286 Prozessor gab es dann einen 24Bit Adressbus, womit dann der Adressbereich auf 2^24 = 16MB anstieg. Die Register aber, also die im 286 waren aber noch 16Bit Register, sodass man wiederrum nur 64kB Segmente haben konnte(2^16=64kB)(sog. 64k Grenze).

    Ab dem 286 wird deshalb nicht nur der realmode, sondern auch der 16bit protectedmode unterstützt. Der löst das Problem mit der Adressierung.

    In meinem Buch steht das real mode bedeutet, und das wurde erst später so bezeichnet, einen max. Speicherbereich bestehend aus der Größe 1Mb zu besitzen.
    Jetzt versteh ich nicht ganz was das mit den Größen auf sich hat?!

    Das ist eine Folge aus der Adressierung im Realmode (mit 2 16bit Register).

    Was ist denn jetzt, wenn ich einen Arbeitsspeicher von 2MB habe und ein real mode programm ausführe, bzw. ein real mode OS wie dos z.B.? Heißt das jetzt, ich kann nur 1MB von den 2MB nutzten? Also nur den ersten MB? Im Segmentteil von 0000 -> ffff
    Ich kann ja nichts anderes machen. Wenn ich z.B nur 4 Hex Stellen für den Segment(XXXX:xxxx) Teil habe und dieser mit 16 multipliziert wird, dann kommt man eben nur auf diese 1MB, aber was ist mit dem 2ten MB?

    Das 2te Mb kannst im normalen realmode net verwenden. Punkt. aus. Amen.



  • Hallo.

    Aha. Also kann ich das 2te MB nicht ansprechen. Das erklärt einiges.
    Zuerst mal, sorry wegen dem 386 anstatt 286...

    Ok. jetzt sind wir also im protected mode. Jetzt hab ich einen 24Bit Adressbus.
    Jetzt kann ich 2^24 Adressen ansprechen, bzw den Bereich. Die Register sind aber immer noch 16 Bit groß, was bedeutet, ich kann nur 64k Segmente benutzen, nicht selbst anlegen oder so... nur benutzen, denn sie sind schon angelegt und bereit verwendet zu werden. Wer legt diese Segmente eigentlich fest? Der Assembler die CPU?

    Aber was bedeuten die Größen jetzt eigentlich wieder?
    16MB Adressraum mit 64k Segmenten.
    Wenn die Register immer noch 16Bit groß sind dann bringen mir doch die 16MB nichts, denn der Segmentteil ist immer nur noch 16 Bit groß, also XXXX:xxxx. Oder ändert sich da jetzt etwas?
    Wie werden die Adressen jetzt gebildet?
    Multipliziert man die jetzt mit... ? Moment mal.
    Im real mode haben 4Bit(2^4) zur Adresse gefehlt. Also mit 16 (2^4)durchmultipliziert. Jezt fehlen aber 8Bit(2^8) von 16 zu 24 Bit. Heißt das jetzt, ich muss wieder mit einer Zahl durchmultiplizieren(z.B. 2^8)?

    Gruß
    Alex



  • DeineMutter schrieb:

    Zuerst mal, sorry wegen dem 386 anstatt 286...

    Der 386er hat wieder einen anderen Protected Mode als der 286er. Du hast bei 386er einen 32bit-Adressbus. Segmente können 32bit lang sein.

    Ok. jetzt sind wir also im protected mode. Jetzt hab ich einen 24Bit Adressbus.
    Jetzt kann ich 2^24 Adressen ansprechen, bzw den Bereich. Die Register sind aber immer noch 16 Bit groß, was bedeutet, ich kann nur 64k Segmente benutzen, nicht selbst anlegen oder so... nur benutzen, denn sie sind schon angelegt und bereit verwendet zu werden. Wer legt diese Segmente eigentlich fest? Der Assembler die CPU?

    Willst du wirklich den 286er-Protected-Mode benutzen? Ist der irgendwo noch angesagt oder ist das nur aus historischen Interesse?



  • ..


  • Mod

    im protected mode spezifizieren die segmentregister die adresse nicht mehr direkt (per konstantem faktor), sondern sind indizes in eine tabelle (SDT wenn mich mein gedächtnis nicht täuscht). diese tabelle musst du selbst erstellen, darin sind die basisadressen der segmente, deren länge und einige zusatzinformationen, wie zugriffsrechte abgelegt. es gibt ein spezielles register, dass die adresse dieser tabelle festhält. analog gibt es eine tabelle, die die einsprungpunkte der interruptroutinen festhält - diese ist also nicht mehr wie im real-mode bei 0:0 zu finden (tatsächlich wird das segment 0 im protected mode stets als ungültig behandelt). allerdings werden nur 13bit für die segmentauswahl wirklich gebraucht, also max 8k segmente (wohl weil die tabelle selbst nicht größer als 64k werden kann) - damit ergibt sich ein maximaler virtueller adressraum von 512MB im 16bit PM.

    im übrigen stehen ab dem 286 im realmode tatsächlich 1MB+64k-16 byte zur verfügung (der sogenannte high-memory) - das liegt daran, dass es beim 286+ nicht zum wrap-around bei hohen speicheradressen kommt, die höchste logische adresse ffff:ffff entspricht also der physischen adresse 10ffef. um kompatibilität mit dem 8086 zu erreichen, griff man deshalb in die trickkiste, und maskierte die 21-te adresse leitung (A20) mittels des tastaturkontrollers (wenn sich das verrückt anhört: das ist es auch - und ursache des berüchtigten A20 bugs), wenn das notwendig wurde.
    im prinzip existiert dieses wraparound problem auch im protected-mode auf dem 386+ (ausser SX, denn der hat nur 24 leitungen) an der 16MB grenze und an der 4GB grenze für 64bit prozessoren oder solche mit PAE - ist aber dort relativ undramatisch.



  • @Bashar:

    Nein, ich will nicht einen 286 oder 386 programmieren, ich will das ganze Ding nur mal von hinten aufrollen. Ich muss doch verstehen, wie das alles so kam, dass es so ist, wie es jetzt ist. Ich will einfach mal so anfangen um mich dann Stück für Stück nach oben zu arbeiten, um dann inline assembler in meinen C++ code einzubinden und was noch viel wichtiger ist, ich will verstehen wie die ganzen Komponenten zusammen arbeiten. So bekommt man einfach einen tieferen Einblick.

    @gargyle:
    ?

    @camper:
    Danke, aber ich glaube das geht für den Moment zu weit...;)

    Ich les jetzt mal in meinem Buch noch ein bischen weiter, vielleicht kommt da dann noch etwas genaueres, wie z.B. diese Tabelle mit der Adressen.

    Gruß
    Alex



  • camper schrieb:

    ...sondern sind indizes in eine tabelle (SDT wenn mich mein gedächtnis nicht täuscht).

    Dein Gedächtnis täuscht dich :p
    Das Ding heißt GDT (Global Descriptor Table) 😉


  • Mod

    bluecode schrieb:

    camper schrieb:

    ...sondern sind indizes in eine tabelle (SDT wenn mich mein gedächtnis nicht täuscht).

    Dein Gedächtnis täuscht dich :p
    Das Ding heißt GDT (Global Descriptor Table) 😉

    stimmt, ja - ist halt schon lange her, dass mich das interessiert hat (da gabs dann wohl noch ne LDT, und das ganze war dann zweigeteilt - jedenfalls heißen die einträge da drin segmentdeskriptoren und der wert, den ein segment register aufnimmt, dann passenderweise segmentselektor). wie auch immer, solange ich bei diesen dingen weis, wie es im prinzip funktioniert, genügt mir das. 🙂


Anmelden zum Antworten