CLI und STI darfst du im Ring 3 eigentlich nicht ausführen, weil du damit den Zustand der CPU kritisch beeinflusst (sonst könntest du im Ring3 den Kernel seiner Zeiteinteilung/seines Schedulers berauben). Im VM86 wird bei CLI und STI ein Extra-Flag gesetzt, was der Scheduler nutzen kann, um solcherart blockierte Prozesse keine Prozessorzeit zu geben.
Wie kann ich prüfen ob sich ein Task im Ring3 befindet ??
Theoretisch brauchst du nur CLI und STI aufrufen und schauen, ob eine Exception "General Protection Fault" auftritt... wenn ja, bist du im Ring 3, wenn nein, bist du im Ring 0 =)
Im Deskriptor für das aktive Codesegment wird festgelegt, in welchem Ring sich ein Task befindet. Der Kernel kann dort nachschauen, ob dein Task Ring3 oder Ring0 ist. Der Task selbst kann das nicht (?).
Wenn du IOPL (ist ein 2-Bit-Flag) auf 0 setzt, kann nur ein Ring0-Prozess die IOPL-sensitiven Befehle ausführen. Wo sich das genau befindet, weiß ich nicht.
Gruß,
Svenska