PMode启用后,远跳会导致三重故障?

时间:2016-07-16 02:51:43

标签: assembly bootloader osdev

我的引导加载程序的这个阶段加载到0x7e0:0x0000。经过一些“调试”后,我发现以下代码在远程跳转后生成三重错误。如果我在跳转之前移动挂起(是的,包括实际的程序本身),它不会出现三重故障。对不起,我不能包含更少的代码。我只是想确保我提供足够的代码,这样就不会错过错误。

这是我的代码:

bits 16

jmp SetUpPMode

GTDData:
    dd 0
    dd 0
    ;Code Descriptor
    dw 0xFFFF
    dw 0
    db 0
    db 10011010b
    db 11001111b
    db 0
    ;Data Descriptor
    dw 0xFFFF
    dw 0
    db 0
    db 10010010b
    db 11001111b
    db 0
GTDEnd:

GDTPointer:
    dw (GTDEnd - GTDData) - 1
    dd GTDData

LoadGDT:
    lgdt [GDTPointer]
    ret

SetUpPMode:
    cli
    mov ax, 0x7E0
    mov ds, ax

    call LoadGDT

    mov eax, cr0
    or eax, 1
    mov cr0, eax

    jmp 0x8:main

bits 32

main:
    mov ax, 0x10
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov esp, 0x90000

    jmp hang

hang:
    ;cli
    hlt
    jmp hang

我敢打赌,错误/错误是明显的,但我似乎无法找到它。有人可以指出来吗? (如果重要的话,我正在使用Virtual Box)

1 个答案:

答案 0 :(得分:4)

您在0x07E0:0x0000加载代码和数据。因此,汇编程序和链接程序所做的所有引用都基于0x07E0:0x0000 - 例如main,可能是0x0020或其他内容。

但您的GDT的代码段基于0x00000000 - 因此jmp 0x8:mainJMP为绝对地址0x00000020或其他东西 - 远离代码所在的位置{ {1}}或任何地方。更改GDT中段的基数,或将代码更改为0x00007E20的实模式段。