Long mode far jmp endet mit Triple Fault
-
Hallo,
ich habe einen kleinen Bootloader geschrieben, der einen zweiten größeren Loader von einer FAT12 Diskette läd. Dieser Loader wechselt dann in den 32-Bit Modus und gibt ein paar Meldungen aus. Soweit so gut. Nun versuche ich in den 64-Bit long mode zu wechseln:
1. PAE aktivieren
2. PML4 Pointer nach cr3 laden
3. IA32e Modus aktivieren
4. Paging aktivierenBis hier hin klappt alles bestens. Nun bin ich ja noch im Kompatibilitätsmodus und möchte in den richtigen 64-Bit long mode wechseln. Dazu lade ich eine 64-Bit GDT und führe einen far jmp in das 64-Bit Codesegment aus:
lgdt[gdtr_x64] jmp SYS_CODE_SEL_X64:do_lm
Und genau bei der Ausführung dieser Sprunganweisung tritt der Triple Fault auf. Bochs meint dazu folgendes:
00153228493i[BIOS ] Booting from 0000:7c00 00174057027e[CPU0 ] interrupt(long mode): unsupported gate type 1 00174057027e[CPU0 ] interrupt(long mode): IDT entry extended attributes DWORD4 TYPE != 0 00174057027i[CPU0 ] CPU is in long mode (active) 00174057027i[CPU0 ] CS.d_b = 16 bit 00174057027i[CPU0 ] SS.d_b = 32 bit 00174057027i[CPU0 ] EFER = 0x00000500 00174057027i[CPU0 ] | RAX=00000000e000003c RBX=0000000000000000 00174057027i[CPU0 ] | RCX=00000000c0000008 RDX=0000000000000100 00174057027i[CPU0 ] | RSP=0000000000001000 RBP=0000000000000000 00174057027i[CPU0 ] | RSI=000000000000048d RDI=0000000000303000 00174057027i[CPU0 ] | R8=0000000000000000 R9=0000000000000000 00174057027i[CPU0 ] | R10=0000000000000000 R11=0000000000000000 00174057027i[CPU0 ] | R12=0000000000000000 R13=0000000000000000 00174057027i[CPU0 ] | R14=0000000000000000 R15=0000000000000000 00174057027i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af PF cf 00174057027i[CPU0 ] | SEG selector base limit G D 00174057027i[CPU0 ] | SEG sltr(index|ti|rpl) base limit G D 00174057027i[CPU0 ] | CS:0010( 0002| 0| 0) 00000500 ffffffff 1 0 00174057027i[CPU0 ] | DS:0018( 0003| 0| 0) 00000500 ffffffff 1 1 00174057027i[CPU0 ] | SS:0018( 0003| 0| 0) 00000500 ffffffff 1 1 00174057027i[CPU0 ] | ES:0008( 0001| 0| 0) 00000000 ffffffff 1 1 00174057027i[CPU0 ] | FS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 00174057027i[CPU0 ] | GS:0008( 0001| 0| 0) 00000000 ffffffff 1 1 00174057027i[CPU0 ] | MSR_FS_BASE:0000000000000000 00174057027i[CPU0 ] | MSR_GS_BASE:0000000000000000 00174057027i[CPU0 ] | RIP=00000000000008a7 (00000000000008a7) 00174057027i[CPU0 ] | CR0=0xe0000011 CR2=0x00000000e000007f 00174057027i[CPU0 ] | CR3=0x00300000 CR4=0x00000020 00174057027i[CPU0 ] 0x00000000000008a7>> imul esi, dword ptr ds:[rax+r12+67], 0x66205550 : 426974204350552066 00174057027e[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting 00174057027i[SYS ] bx_pc_system_c::Reset(HARDWARE) called 00174057027i[CPU0 ] cpu hardware reset
Leider stehe ich grade auf dem Schlauch was die Fehlerdiagnose angeht und hoffe, dass jemand von euch mir ein wenig helfen kann.
Danke