Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: sebi2020 am 30. January 2010, 02:50
-
Halo,
ich hab jetzt mal versucht, das mit dem Userspace zu implementieren. Nun wird, wenn ich einen Ring3 task erstelle kein timerinterrupt mehr ausgeführt. (Wenn ich eine ring0 task starte läuft fast alles wunderbar). was für Gründe kann es so im allgemeinen haben, dass ein Timerinterrupt nicht mehr gestartet wird?
mfg Sebi
-
Bei einem Ringwechsel von Ring3 -> Ring0 brauchst du ein TSS (das natürlich auch geladen sein muss) und darin sollten esp0 und ss0 korrekt gesetzt sein. Außerdem sollte der Interrupthandler darauf ausgelegt sein, dass es ein Ringwechsel gibt, da wird schließlich mehr (automatisch) gepusht/popt.
Du solltest mal in bochs bzw. qemu mal schauen ob überhaupt der Interrupt auftritt (und eventuell danach irgendwelche Exceptions), bei qemu sieht man die Interrupts mit dem Zusatzparameter -d int (dann stehen die Interrupts im qemu log) und bei bochs muss man im Menü das Logging des CPU0 Device überall auf 'report' stellen.
-
Wenn ich das richtig sehe wird der Interrupt er im ring0 task ausgeführt wurde und zum ring3 task weiterschaltet nicht mehr ausgeführt wird, hier mein bochs.log:
protected mode activated
00028503346d[CPU0 ] 64 bit TSS base = 0x0000000000185540
00028565920d[CPU0 ] interrupt(): vector = 20, TYPE = 0, EXT = 1
00028565920d[CPU0 ] interrupt(): INTERRUPT TO SAME PRIVILEGE
00028785624d[CPU0 ] interrupt(): vector = 20, TYPE = 0, EXT = 1
00028785624d[CPU0 ] interrupt(): INTERRUPT TO SAME PRIVILEGE
00064648000p[XGUI ] >>PANIC<< POWER button turned off.
00064648000i[CPU0 ] CPU is in protected mode (active)
00064648000i[CPU0 ] CS.d_b = 32 bit
00064648000i[CPU0 ] SS.d_b = 32 bit
00064648000i[CPU0 ] EFER = 0x00000000
00064648000i[CPU0 ] | RAX=0000000000000000 RBX=0000000000000000
00064648000i[CPU0 ] | RCX=00000000000b80a0 RDX=00000000000b8da0
00064648000i[CPU0 ] | RSP=0000000000106254 RBP=0000000000106264
00064648000i[CPU0 ] | RSI=0000000000000000 RDI=0000000000000000
00064648000i[CPU0 ] | R8=0000000000000000 R9=0000000000000000
00064648000i[CPU0 ] | R10=0000000000000000 R11=0000000000000000
00064648000i[CPU0 ] | R12=0000000000000000 R13=0000000000000000
00064648000i[CPU0 ] | R14=0000000000000000 R15=0000000000000000
00064648000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df if tf sf zf af PF cf
00064648000i[CPU0 ] | SEG selector base limit G D
00064648000i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D
00064648000i[CPU0 ] | CS:001b( 0003| 0| 3) 00000000 ffffffff 1 1
00064648000i[CPU0 ] | DS:0023( 0004| 0| 3) 00000000 ffffffff 1 1
00064648000i[CPU0 ] | SS:0023( 0004| 0| 3) 00000000 ffffffff 1 1
00064648000i[CPU0 ] | ES:0023( 0004| 0| 3) 00000000 ffffffff 1 1
00064648000i[CPU0 ] | FS:0000( 0002| 0| 0) 00000000 ffffffff 1 1
00064648000i[CPU0 ] | GS:0000( 0002| 0| 0) 00000000 ffffffff 1 1
00064648000i[CPU0 ] | MSR_FS_BASE:0000000000000000
00064648000i[CPU0 ] | MSR_GS_BASE:0000000000000000
00064648000i[CPU0 ] | RIP=0000000000100739 (0000000000100739)
00064648000i[CPU0 ] | CR0=0x00000011 CR2=0x0000000000000000
00064648000i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
00064648000i[CPU0 ] 0x0000000000100739>> add dword ptr ss:[ebp+0xfffffffc], 0x00000001 : 8345FC01
mfg Sebi
-
00064648000i[CPU0 ] | IOPL=0 id vip vif ac vm rf nt of df *if* tf sf zf af PF cf
Das IF flag ist 0. Deshalb werden keine Interrupts durchgelassen. Initialisierst du EFLAGS mit 0? Versuchs mal mit 0x200.
-
oh, stimmt, ich hatte eflags beim initalisiern vom ring3 task ausversehen auskommentiert
// .eflags = 0x202,
Kein wunder dass es nicht funktioniert hat.