Hallo liebe community,
ich habe mal wieder ein komisches Problem. Ich hab mein Taskswitching implementiert. Nachdem dies für den Kernelmode functioniert hat hab ich jetzt das cs-Register so verändert, dass er theoretisch in den Usermode wechseln sollte, was er aber nicht tut. Stattdessen gibt es #GP und als Errorcode wird der Segmentregisterindex des cs-Registers, der geladen werden sollte, angegeben.
Im Anhang ist ein Bildschirmfoto des Fehlers.
Der Stackbacktrace, den ihr auf dem Foto seht, sind die Werte auf dem Stack, wie sie vor der Exception waren und der instruction pointer zeigt auf den iretq Befehl, der dann die Werte vom Stack gepoppt hätte. Ich weiss nich was falsch ist mit dem Codesegmentindex.
Hier ein kleiner Ausschnitt aus dem Log von Bochs:
CPU0:
rax: 00000000_00000000 rcx: 00000000_00000000
rdx: 00000000_00000000 rbx: 00000000_00000000
rsp: ffffff7f_ffffffd8 rbp: 00000000_00000000
rsi: 00000000_00000000 rdi: 00000000_00000000
r8 : 00000000_00000000 r9 : 00000000_00000000
r10: 00000000_00000000 r11: 00000000_00000000
r12: 00000000_00000000 r13: 00000000_00000000
r14: 00000000_00000000 r15: 00000000_00000000
rip: 00000000_00108ec7
eflags 0x00000086: id vip vif ac vm rf nt IOPL=0 of df if tf SF zf af PF cf
[CPU0 RD]: LIN 0xffffff7fffffffe8 PHY 0x000000233fe8 (len=8, pl=0): 0x00000000 0x00000202
[CPU0 RD]: LIN 0xffffff7fffffffe0 PHY 0x000000233fe0 (len=8, pl=0): 0x00000000 0x00000018
[CPU0 RD]: LIN 0xffffff7fffffffd8 PHY 0x000000233fd8 (len=8, pl=0): 0x00000080 0x0000004F
[CPU0 RD]: LIN 0x000000000021a138 PHY 0x00000021a138 (len=8, pl=0): 0x00AFFA00 0x0000FFFF
[CPU0 RD]: LIN 0x000000000021a230 PHY 0x00000021a230 (len=8, pl=0): 0x00108E00 0x00088DC3
[CPU0 RD]: LIN 0x000000000021a238 PHY 0x00000021a238 (len=8, pl=0): 0x00000000 0x00000000
[CPU0 RD]: LIN 0x000000000021a128 PHY 0x00000021a128 (len=8, pl=0): 0x00AF9B00 0x0000FFFF
[CPU0 RD]: PHY 0x000000232ff0 (len=8): 0x00000000 0x0023402F ; PML4E
[CPU0 RD]: PHY 0x000000234ff8 (len=8): 0x00000000 0x0023502F ; PDPTE
[CPU0 RD]: PHY 0x000000235ff8 (len=8): 0x00000000 0x0023602F ; PDE
[CPU0 RD]: PHY 0x000000236ff8 (len=8): 0x00000000 0x0023302F ; PTE
[CPU0 WR]: PHY 0x000000236ff8 (len=8): 0x00000000 0x0023306F ; PTE
[CPU0 WR]: LIN 0xffffff7fffffffc8 PHY 0x000000233fc8 (len=8, pl=0): 0x00000000 0x00000010
[CPU0 WR]: LIN 0xffffff7fffffffc0 PHY 0x000000233fc0 (len=8, pl=0): 0xFFFFFF7F 0xFFFFFFD8
[CPU0 WR]: LIN 0xffffff7fffffffb8 PHY 0x000000233fb8 (len=8, pl=0): 0x00000000 0x00010086
[CPU0 WR]: LIN 0xffffff7fffffffb0 PHY 0x000000233fb0 (len=8, pl=0): 0x00000000 0x00000008
[CPU0 WR]: LIN 0xffffff7fffffffa8 PHY 0x000000233fa8 (len=8, pl=0): 0x00000000 0x00108EC7
[CPU0 WR]: LIN 0xffffff7fffffffa0 PHY 0x000000233fa0 (len=8, pl=0): 0x00000000 0x00000018
Wie man sieht wird eine Exception ausgelöst, sobald die CPU den GDT-Eintrag für CS gelesen hat.
Wieso gibt es diesen Fehler? Ich hoffe ihr könnt mir helfen.