Autor Thema: Grow Down Segmente  (Gelesen 6738 mal)

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« am: 30. September 2005, 19:12 »
Hallo, ich möchte ein Grow Down Stack-Segment anlegen und hab da mal eine Frage, da es nicht genau aus meinem Buch hervorgeht, wie dabei die Größe des Segments festgelegt wird:

Wenn ich im Descriptor das ED (Expansion Direction) Bit setze, dann verstehe ich das so, dass man mit der Basisadresse die Adresse angibt, ab der der Offset gezählt wird und mit dem Limit-Feld gibt man die obere Segmentgrenze an. Aber wie wird dann die untere Grenze angegeben?

MM

ena

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 30. September 2005, 19:26 »
hm...
also so wie ich dich verstehe wuerd ich sagen das die basisadresse die untere grenze.

basisadresse:offset?!

mfg ena

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #2 am: 30. September 2005, 20:23 »
Dann würde es ja ein Grow Up Segment sein, wenn die Adressierung bei 0 losgehen würde. Es muss ja aber so etwa aussehen:

        +-----+ <- Obergrenze
        |xxxxx|
        |xxxxx|
        +-----+ <- Untergrenze
        |     |
Base -> +-----+


MM

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #3 am: 30. September 2005, 21:11 »
Hab grad diesen interessanten Artikel gefunden:
http://www.sudleyplace.com/dpmione/expanddown.htm
So wie das da drin steht ist die Obergrenze IMMER entweder bei 4gb-1 oder 64kb-1.
Die 4gb Version würde dann ja bedeuten, dass man als Basisadresse die 0 angeben muss und automatisch alle (virtuellen) Adressen von 0xFFFFFFFF bis 0xFFFFFFFF-limit für dieses Segment benutzt werden, wodurch man ja immer nur ein solches Segment auf einmal benutzen könnte.

Ich hoffe, dass ich mich da irre, weil so fände ich das ziemlich dumm,
MM

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #4 am: 01. October 2005, 13:01 »
Wie macht ihr das eigentlich mit eurem Stack?
Ich meine, ich will ganz gerne, dass sich Stack und Datensegment überlagern, damit ich in meinem Programm auch Zeiger auf lokale Variablen anlegen kann. Also so, dass das Datensegment am Ende auch den Stack umschließt, der Stack aber nicht in die Daten hineinwachsen kann, sondern vorher einen Stack-Overflow Fehler liefert. Eigentlich dachte ich mit dem Grow Down Segment eine solche Möglichkeit gefunden zu haben...

MM

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #5 am: 02. October 2005, 00:42 »
Eine Möglichkeit, die mir eingefallen ist wäre, dass man das mit nem WorkArround per Paging macht, also, dass man Daten und Stackbereich durch eine "ausgelagerte" Page trennt, die dann einen Pagefault auslöst:

|Daten|
|Daten|  wächst nach oben (hier unten)
|     |
+-----+
|Page |
+-----+
|     |
|Stack|  wächst nach unten (hier oben)

Aber so richtig professionell kommt mir das nicht vor, wie macht ihr das? Oder benutzt ihr für Zeiger auf lokale Variablen Far-Pointer?

MM

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #6 am: 02. October 2005, 03:30 »
Mir ist grad noch was eingefallen, wie es eventuell mit dem Grow Down Segment doch klappen könnte. Wenn ich nun zB meine Segmentobergrenze bei der Adresse 0x1000 haben, dann könnte ich doch die den Base-Wert im Descriptor wie folgt wählen:

Base: 0x1000
Da Base: 0x1000 + 0x100000000 = 0x100001000
und in 32 Bit = 0x1000
Müßte doch eigentlich gehen, oder meckert da die CPU wegen dem Überlauf?
Mal nebenbei, was ist eigentlich, wenn ich ein Normales Segment an der Adresse 0xFFFF0000 mit der Größe von 0x20000 anlege?

MM

 

Einloggen