【发布时间】:2013-10-11 16:06:02
【问题描述】:
我正在尝试创建非常简单的 64 位操作系统。我试图先进入保护模式,但此时我失败了。
当我执行远跳转到 32 位时,机器重新启动。
我的代码通过地址 0x100 的另一个汇编程序加载到内存中。
代码是用 nasm 编译的,我正在使用 qemu -fda 运行程序。
这是我目前得到的代码:
[BITS 16]
jmp _start
_start:
cli
lgdt [GDT64]
; Switch to protected mode
mov eax, cr0
or al, 1b
mov cr0, eax
; Desactivate pagination
mov eax, cr0
and eax, 01111111111111111111111111111111b
mov cr0, eax
jmp (CODE_SELECTOR-GDT64):pm_start
[BITS 32]
pm_start:
jmp $
GDT64:
NULL_SELECTOR:
dw GDT_LENGTH ; limit of GDT
dw GDT64 ; linear address of GDT
dd 0x0
CODE_SELECTOR: ; 32-bit code selector (ring 0)
dw 0x0FFFF
db 0x0, 0x0, 0x0
db 10011010b
db 11001111b
db 0x0
DATA_SELECTOR: ; flat data selector (ring 0)
dw 0x0FFFF
db 0x0, 0x0, 0x0
db 10010010b
db 10001111b
db 0x0
LONG_SELECTOR: ; 64-bit code selector (ring 0)
dw 0x0FFFF
db 0x0, 0x0, 0x0
db 10011010b ;
db 10101111b
db 0x0
GDT_LENGTH:
如果我在跳远之前执行jmp $,它可以工作,程序会正确停止,但是当跳远完成时,它会重新启动机器。
我是不是忘了设置一个段或类似的东西?
【问题讨论】:
标签: assembly x86 intel qemu protected-mode