Autor Thema: "Sichtbarkeit" von Segmentregistern im Interruptcontext  (Gelesen 6471 mal)

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
Hallo, im Beispielkernel wird mit diesem Code in den Ring3 gewechselt:
    // Kernel-Datensegmente laden
    mov $0x10, %ax
    mov %ax, %ds
    mov %ax, %es
Aber wenn dieser Code doch noch im Userspace ist,wieso wird beim Segmentregister ax kein Invalid Opcode ausgelöst. Hat dass was mit dem InterruptFlag zu tun dass im Interrupt Context die CPU automitisch die Segmentregister sichtbar macht?
EDIT:
Ja gut AX sind die letzten 16Bits von EAX(das hätte ich wissen können :oops:)
« Letzte Änderung: 18. January 2013, 20:38 von Martin Erhardt »

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 18. January 2013, 20:31 »
Hallo,


im Beispielkernel wird mit diesem Code in den Ring3 gewechselt
Ich glaube das ist schon Dein erstes Verständnisproblem. Wenn ich den Kommentar in dem Code richtig deute dann ist dieser Code Bestandteil des Kernels und wird im Ring 0 ausgeführt und sorgt nur dafür das in den Segmentregistern DS und ES auch passende Selectoren drin sind damit der Kernel-Code (der ja DS und ES implizit benutzt) richtig funktioniert.

wieso wird beim Segmentregister ax kein Invalid Opcode ausgelöst.
AX ist kein Segmentregister. siehe http://www.lowlevel.eu/wiki/X86#Segmentregister

Hat dass was mit dem InterruptFlag zu tun dass im Interrupt Context die CPU automitisch die Segmentregister sichtbar macht?
Die Segmentregister sind in jedem Ring sichtbar (also lesbar) und auch änderbar (also beschreibbar), eine Exception kommt nur dann wenn auf Speicher zugegriffen werden soll und der im Hintergrund geladene Descriptor (der über den Selector selektiert wird) ungültig ist oder nicht die passenden Zugriffsrechte anbietet. Mit dem Interrupt-Flag hat das nichts zu tun.


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

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 18. January 2013, 20:37 »
Okay vielen dank wenn mit dem Segmentwechsel also nicht der Rang gewechselt wird wie dann?

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 18. January 2013, 20:41 »
wenn mit dem Segmentwechsel also nicht der Rang gewechselt wird wie dann?
Der aktuelle Ring wird immer mit dem Wechsel von CS geändert aber da gibt es eine Menge Regeln zu beachten (die von der CPU durchgesetzt werden) damit nicht jeder (Schad)-Code hier alles tun darf. Der Wechsel von CS kann automatisch passieren z.B. bei einem Interrupt/Exception oder einem HW-Kontext-Wechsel oder auch manuell angetriggert werden wie mit einem FAR-CALL.
Reality is that which, when you stop believing in it, doesn't go away.

 

Einloggen