PMode使能后远跳导致三重故障?
Far jumping causes triple fault after PMode is enabled?
我的引导加载程序的这个阶段在 0x7e0:0x0000
加载。在一些 "debugging" 之后,我发现以下代码在我的 far jump 之后生成了一个三重错误。如果我在跳转之前移动挂起(是的,包括实际程序本身),它不会出现三重故障。对不起,我不能包含更少的代码。我只是想确保我提供了足够的代码,以免遗漏错误。
这是我的代码:
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
我敢打赌 bug/error 非常明显,但我似乎找不到它。有人可以指出吗? (如果重要的话,我正在使用 Virtual Box)
您在 0x07E0:0x0000
加载代码和数据。因此,汇编器和链接器所做的所有引用都基于 0x07E0:0x0000
- 例如 main
,它可能是 0x0020
或其他东西。
但是你的 GDT 有基于 0x00000000
的代码段 - 所以 jmp 0x8:main
会 JMP
到绝对地址 0x00000020
或其他东西 - 离代码所在的地方不远在 0x00007E20
或任何地方。要么更改 GDT 中段的基址,要么更改代码以从 0x0000
.
的实模式段开始工作
我的引导加载程序的这个阶段在 0x7e0:0x0000
加载。在一些 "debugging" 之后,我发现以下代码在我的 far jump 之后生成了一个三重错误。如果我在跳转之前移动挂起(是的,包括实际程序本身),它不会出现三重故障。对不起,我不能包含更少的代码。我只是想确保我提供了足够的代码,以免遗漏错误。
这是我的代码:
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
我敢打赌 bug/error 非常明显,但我似乎找不到它。有人可以指出吗? (如果重要的话,我正在使用 Virtual Box)
您在 0x07E0:0x0000
加载代码和数据。因此,汇编器和链接器所做的所有引用都基于 0x07E0:0x0000
- 例如 main
,它可能是 0x0020
或其他东西。
但是你的 GDT 有基于 0x00000000
的代码段 - 所以 jmp 0x8:main
会 JMP
到绝对地址 0x00000020
或其他东西 - 离代码所在的地方不远在 0x00007E20
或任何地方。要么更改 GDT 中段的基址,要么更改代码以从 0x0000
.