Autor Thema: Protected Mode ?  (Gelesen 4306 mal)

bscreator

  • Gast
Gespeichert
« am: 27. June 2007, 14:34 »
Hi Leute,
schön, mal wieder mitten unter den OS-Codern zu sein. Hab ne Frage über den Protected Mode. Hab letztens erst angefangen, mich über den PM schlau zu machen, also bitte um Nachsicht. Sollte eine Aussage von mir nicht stimmen, dann habt keine Skrupel, diese zu korrigieren.
PS: Ich verwende das segmentierte Speichermodell. (Also kein Paging).

1. Im Real-Mode kann man nur auf 1 MB Arbeitsspeicher zugreifen, im PM auf bis zu 4 GB (Falls im Computer vorhanden)

2. Beim segmentierten Speichermodell wird der Arbeitsspeicher in Segmente mit einer bestimmten Größe eingeteilt (in 8192 Segmente)

2. Die GDT beinhaltet das Null-,Code- und Datensegment. Brauch ich die GDT nur für diese Segmente ?

3. Wie kann ich auf den Inhalt eines Segments im Arbeitsspeicher direkt zugreifen (z.B. eine Zahl in ein Segment speichern?) ?

Vielen Dank im Vorraus
« Letzte Änderung: 28. June 2007, 13:12 von hannibal »

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 27. June 2007, 14:43 »
Zuerst mal...ich würde ein flaches Speichermodell nehmen...aber du musst es wissen:
1. Ja ev. auch mehr mit diversen Spezialmodes usw.
2. Es müssen nicht 8192 Segmente sein...Schon 2 würden es tun.
2b. Die GDT beinhaltet keine Segmente sondern Deskriptoren auf Segmente...Es gibt noch andere Deskriptoren, die dich allerdings nicht zu kümmern brauchen z.B. TSS-Desktriptoren, wenn du mal Multitasking machen willst.
3. Du lädst in ein Segmentregister (cs,ds,es,fs,gs,ss) die Position eines Desktriptors (fall es ein Deskriptor dessen Segment nicht ein Segment des 0. Ringes ist, musst du eventuell noch die beiden letzten Bits setzen). Beispiel: mov ax,0x10
mov ds,ax
mov bx,variable ;in bx die Variable
mov bx,0x8 ; lädt den Wert 8 in die Variable.


Gruss
Nooooooooooos

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 27. June 2007, 15:06 »
2. Beim segmentierten Speichermodell wird der Arbeitsspeicher in Segmente mit einer bestimmten Größe eingeteilt (in 8192 Segmente)
In Ergänzung zu Noos, wobei ich nicht sicher bin, ob ich dich richtig verstanden habe: Du kannst bis zu 8192 Segmente benutzen, mußt es aber nicht. Falls du mit der "bestimmten Größe" meinst, daß alle Segmente gleich groß sind: Jedes Segment hat seine eigene Größe, die im jeweiligen Eintrag der GDT steht.

Zitat
2. Die GDT beinhaltet das Null-,Code- und Datensegment. Brauch ich die GDT nur für diese Segmente ?
Du brauchst die GDT für jedes Segment, das du benutzen möchtest. Die GDT definiert die Segmente überhaupt erst.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bscreator

  • Gast
Gespeichert
« Antwort #3 am: 27. June 2007, 17:50 »
Aha, ok.

1. Soviel ich weiß verwendet Windows und OS/2 das flache Speichermodell.
Ich verwende nur das segmentierte, weil das in nem Beispiel vorkam.
Ist das flache Speichermodell nicht komplizierter als das segmentierte Speichermodell ?

2. Aha, das mit der GDT ist mir jetzt klar. Die beinhaltet nicht die Segmente, sondern nur die Deskriptoren (sog. Zeiger auf die Segmente).

3. Danke für den Code. Ich hab nur immer irgendwie das Gefühl, wenn ich mit den Prozessorregistern programmier, dass ich nicht direkt auf den Arbeitsspeicher zugreife (z.B. in Form einer Speicheradresse), sondern "nur" mit den Prozessorregistern programmier.

Gruss,
bsc


nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 27. June 2007, 18:30 »
Also das du mich richtig verstehst. mit mov bx,Variable wird nur ein Zeiger also die Adresse im Speicher nach bx geladen. (Also das Offset=die Anzahl Bytes nach dem Segment beginn)
das mov bx,0x8 ist sogar falsch es muss mov [bx],0x8 heissen. Die Klammer bedeuten das die 8 dorthin in den Speicher geschrieben werden muss, wie der Wert von bx ist...

Also ich finde flaches Speichermodell viel einfacher...Ich hab aber nicht lange mit Segmenten gearbeitet...Weil mit dem flachen Modell musst du dich  nur noch ums Offset kümmern und dieses wird dann immer vom Anfang des Speichers aus gezählt.

Gruss
Nooooooooooooos


kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 27. June 2007, 19:21 »
Ist das flache Speichermodell nicht komplizierter als das segmentierte Speichermodell ?
Eher umgekehrt. Beim flachen Modell hast du einfach durchgehenden Speicher von 0 bis x und das war's.

Zitat
Aha, das mit der GDT ist mir jetzt klar. Die beinhaltet nicht die Segmente, sondern nur die Deskriptoren (sog. Zeiger auf die Segmente).
Das erklärt dann auch, wieso in GDT ein D drin ist, oder? ;)

Zitat
Danke für den Code. Ich hab nur immer irgendwie das Gefühl, wenn ich mit den Prozessorregistern programmier, dass ich nicht direkt auf den Arbeitsspeicher zugreife (z.B. in Form einer Speicheradresse), sondern "nur" mit den Prozessorregistern programmier.
Ist auch so. Der Code setzt nur das Segmentregister, das dann implizit bei jedem Speicherzugriff eine Rolle spielt.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bscreator

  • Gast
Gespeichert
« Antwort #6 am: 27. June 2007, 21:39 »
OK, dann werd ich mich mal mit dem flachen Speichermodell beschäftigen. Wie gesagt, ich hab das segmentierte Speichermodell aus nem Beispiel ("World of Protected Mode", gibts bei www.osdever.net).
Wenn jemand von euch ein PM-Tutorial mit flachem Speichermodell kennt, dann bitte her damit...

Zitat
Ist auch so. Der Code setzt nur das Segmentregister, das dann implizit bei jedem Speicherzugriff eine Rolle spielt.
Zitat

Aber greift ein Speicherverwaltungsmanager nicht auch direkt auf den Arbeitsspeicher zu?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 28. June 2007, 10:18 »
Wenn jemand von euch ein PM-Tutorial mit flachem Speichermodell kennt, dann bitte her damit...
Da dürfte sich sogar in unserem Wiki was finden. Entweder das PM-Tut von TeeJay oder in irgendeiner Magazin-Ausgabe.

Zitat
Zitat
Ist auch so. Der Code setzt nur das Segmentregister, das dann implizit bei jedem Speicherzugriff eine Rolle spielt.
Aber greift ein Speicherverwaltungsmanager nicht auch direkt auf den Arbeitsspeicher zu?
Die Segmentregister sind immer im Spiel. Faktisch arbeitest du beim flachen Speichermodell aber direkt auf dem Speicher, weil deine Segmente bei 0 anfangen und über den ganzen Adreßraum gehen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bscreator

  • Gast
Gespeichert
« Antwort #8 am: 28. June 2007, 14:59 »
Nur damit ich das richtig versteh...
flaches Speichermodell heißt Paging, oder ?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 28. June 2007, 15:43 »
Nein, flaches Speichermodell heißt nur, Segmente haben eine Basisadresse von 0 und gehen über den gesamten Adreßraum. Mit Paging hat das erstmal nichts zu tun. Eine sinnvolle Umsetzung wird natürlich Paging benutzen, aber für den Anfang ist das nicht nötig.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen