Blog
Interruptstack in Long Mode Ring 0
2022-05-02
In den Folien zur 1. Aufgabe war ein Fehler, dort hatte ich behauptet, die CPU legt bei Unterbrechungen in Ring 0 nur rip
, cs
und rflags
auf den Stack.
Das war zwar im Protected Mode so, aber im Long Mode liegen da nun immer auch noch ss
& rsp
davor – wie bei Unterbrechungen während wir uns im Ring 3 befinden. Details dazu stehen im Intel Manual Vol. 3 unter 6.14:
The stack pointer (SS:RSP) is pushed unconditionally on interrupts. In legacy modes, this push is conditional and based on a change in current privilege level (CPL).
Das Verhalten wird auch ziemlich gut in dem Intel Manual Vol. 2, “IRET/IRETD—Interrupt Return” am Ende von “Operation” (dem Pseudo-Code der Instruktion) gezeigt: In jedem Pfad gibt es da ein
ESP/RSP ← Pop();
SS ← Pop();
Die entsprechende Folie ist nun ausgebessert, Entschuldigung wenn ich da jemanden verwirrt haben sollte! Für die Aufgabe selbst sollte das jedoch nicht notwendig sein, da ihr ja eh nur einen Ring 3 Interrupt Stack faken müsst, außerdem sind die Strukturen in eurer Vorgabe (wie InterruptContext
in interrupt/handler.h
) korrekt.