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 aktivieren

    Bis 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 🙂


Anmelden zum Antworten