Autor Thema: Verständnisfragen zu Segmentregistern  (Gelesen 4369 mal)

fabuloes

  • Beiträge: 14
    • Profil anzeigen
Gespeichert
« am: 03. May 2011, 19:56 »
Ich bins mal wieder, diesmal mit ein paar Fragen zu den Segmentregistern im PM

Die Register haben bei mir im Moment standardmäßig die Werte 0x10, bzw 0x08 (nur der Codesegmentregister), wenn
man das mal auflöst dann heißt das doch, dass alle Datensegmentregister gerade auf den 2. Eintrag der GDT zeigen (mit Privilege 0), und der Codesegmentregister auf den 1. (auch mit Privilege 0), oder? Meine GDT ist auch so aufgebaut, dass der 1. Eintrag das Codesegment für den Kernel ist und der 2. das Datensegment.
Werden jetzt dann später beim Wechseln in den Kontext eines Prozesses im Usermode einfach die Segmentregister auf die
für sie reservierten Segmente gesetzt? Weil das Verändern des %cs Registers bei mir noch eine Schutzverlezungsexception auslöst, weiß ich nämlich nicht wie ich das dann später handhaben soll...

Verbessert mich wenn ich totalen Stuss schreiben sollte...  :wink:

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 03. May 2011, 20:18 »
Hi,

direktes Laden bzw. ein Sprung funktionieren für diese Art von Ring-Wechsel nicht. Wenn du von den Kernel Mode in den User Mode wechseln willst, solltest du eine IRET-Instruktion verwenden. Dazu musst du nacheinander die Werte für SS, ESP, EFLAGS, CS und EIP auf den Stack legen und danach IRET ausführen.* Um vom User Mode in den Kernel zurückzukommen, musst du einen Interrupt aufrufen. Dazu brauchst du eine entsprechend eingerichtete IDT.

Die Teile 5 und 6 des Tutorial zeigen, wie das aussehen kann.

*Alternativ kannst du im Prinzip diese Werte in umgekehrter Reihenfolge hintereinander in den Speicher schreiben, ESP auf den Wert für EIP zeigen lassen und dann IRET ausführen. Das Tutorial geht diesen Weg (legt allerdings noch mehr Register auf den Stack, siehe struct cpu_state).
« Letzte Änderung: 03. May 2011, 20:21 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 03. May 2011, 20:27 »
Hallo,


Weil das Verändern des %cs Registers bei mir noch eine Schutzverlezungsexception auslöst
Du kannst in ein Segment-Register nur Werte reinladen für die es auch gültige Descriptoren gibt. Wenn Du nur ein einziges Code-Segment per Descriptor beschrieben hast dann gibt es auch nur einen einzigen Wert den Du in CS laden kannst.
Du benötigst also mehr Descriptoren (für Code-Segmente) um auch andere Werte in CS laden zu können.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

 

Einloggen