Autor Thema: Ports Sperren  (Gelesen 6228 mal)

Hunter

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« am: 22. February 2007, 16:35 »
Hallo,

ich wollte mal fragen ob es eigentlich möglich ist für alle Ring3 Tasks die Ports und CLI,STI,... zu sperren ?? Wenn ja wie ?? Ich glaube mal gehört zu haben das man das mit den EFLAGS einstellen kann ...

Mit freundlichen Grüßen
Hunter

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 22. February 2007, 17:56 »
cli/sti können Ring3 tasks generell überhaupt nicht und die Ports sind normalerweise auch gesperrt, aber man kann sie durch anpassen des IOPL in den eflags diese Sperrung für einen best. task aufheben. Wenn man aber für einen Task nur best. Ports zulassen will, dann ist die IO Permission Bitmap im TSS dafür besser geeignet.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 22. February 2007, 18:01 »
Hallo,

im Ring 3 sind privilegierte Befehle nicht erlaubt; dazu gehören z.B. CLI, STI, IN, OUT. Ausnahme ist der VM86, wo der VM86-Monitor diese Befehle abfangen muss.
Für diese Befehle gibt es zwei Schutzebenen - einmal das IOPL-Flag (welches Level muss ein Codesegment haben, um IN und OUT aufrufen zu dürfen; gilt für Codesegment und alle Ports; 286+) und die IO-Permission-(Bit)Mask (welche Ports darf dieser Task aufrufen; gilt für Task und einzelne Ports; 386+).

Das IOPL-Flag befindet sich in den EFlags, die IO-Permission-Map befindet sich oberhalb des TSS (bei 386-kompatiblen-TSS).

Zwei Links, die das kurz ausführen:
http://www.tecchannel.de/entwicklung/grundlagen/402223/index25.html (IOPL)
http://www.tecchannel.de/entwicklung/grundlagen/402223/index26.html (IO-Permission-Map)
...ich vermute, die sind aus dem PC-Hardwarebuch abgeschrieben...

Ich hoffe, ich konnte dir ein paar Stichworte geben und ein paar Hinweise, wonach du gucken kannst. Für genauere Fragen sind andere wohl kompetenter als ich. :-) [und schreiben weniger]

@bluecode: In dem einen Link stand drin, dass auch CLI und STI vom IOPL-Flag beeinflusst werden. Aber ich will mich nicht festlegen.

Gruß,
Svenska

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 22. February 2007, 18:30 »
Das ist afaik nur im virtual-8086-mode so:
Zitat
When an IA-32 processor is running in virtual-8086 mode, the CLI, STI, PUSHF, POPF, INT n, and IRET instructions are sensitive to IOPL. The IN, INS, OUT, and OUTS instructions, which are sensitive to IOPL in protected mode, are not sensitive in virtual-8086 mode.
Im Protected-mode ist afaik nur in/out und Konsorten IOPL sensitiv. edit: Und damit hab ich unrecht, wie ich grad feststellen muss.

btw. frag doch nicht in 2 Foren gleichzeitig, oder gib wenigstens einen Link an :wink:
« Letzte Änderung: 22. February 2007, 18:33 von bluecode »
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Hunter

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 22. February 2007, 18:40 »
Also kann es schon sein dass ring3 Tasks cli und sti verwenden können ?
Ansonsten laufen die Tasks in meinem OS doch nicht in ring3 da "ring3-Tasks" sti,... ausführen können ...

Wie kann ich prüfen ob sich ein Task im Ring3 befindet ??
(Wenn ich einen Task mit SS: 0x20|3 und CS:0x18|3 initialisiere [eine TSS wird natürlicha auch verwendet] läuft dieser dann automatisch im Ring3 ??)

Wie muss man eigentlich die EFLAGS setzen damit die Ports gesperrt sind ?

Mit freundlichen Grüßen
Hunter

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 23. February 2007, 14:48 »
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.

Zitat
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

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 23. February 2007, 15:08 »
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 =)
Jetzt fühlen sich aber Ring 1 und 2 sicher übergangen und sind beleidigt.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 23. February 2007, 19:49 »
Zitat
Wie kann ich prüfen ob sich ein Task im Ring3 befindet ??
bits 0 und 1 von cs und ss geben das cpl an.
Dieser Text wird unter jedem Beitrag angezeigt.

Hunter

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 23. February 2007, 22:16 »
OK ... Vielen Dank für eure Antworten ... Das Problem hat sich gelöst ... Irgendwie liefen die Tasks nicht im ring3 aber jetzt funktionierte es denn bei einem STI,CLI,OUT,IN kommt ein GP ...

Mit freundlichen Grüßen
Hunter

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 26. February 2007, 16:23 »
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 =)
Jetzt fühlen sich aber Ring 1 und 2 sicher übergangen und sind beleidigt.
Die werden sowieso nicht benutzt :evil:, weder von Windows noch von Linux noch von Minix. OS/2 benutzt m.W. zusätzlich noch Ring 1 oder 2...

Gruß,
Svenska

 

Einloggen