Autor Thema: Kein Timerinterrupt nach Ringwechsel (3)  (Gelesen 5162 mal)

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« 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
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 30. January 2010, 09:32 »
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.
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

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #2 am: 30. January 2010, 14:50 »
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
« Letzte Änderung: 30. January 2010, 14:55 von sebi2020 »
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 30. January 2010, 15:09 »
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.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

sebi2020

  • Beiträge: 130
    • Profil anzeigen
    • Infortus OS
Gespeichert
« Antwort #4 am: 30. January 2010, 16:23 »
oh, stimmt, ich hatte eflags beim initalisiern vom ring3 task ausversehen auskommentiert
// .eflags = 0x202,Kein wunder dass es nicht funktioniert hat.
Please press any-key...
Verflucht wo ist any-key? hier? ach Mist, das war Escape...

 

Einloggen