【发布时间】:2013-09-02 08:29:15
【问题描述】:
我是根据 Nick Blundell 的一本书来做的。我写了一个MBR程序,它首先在实模式下运行,程序中的一些指令会将cpu切换到保护模式。 首先,我这样设置 GDT:
gdt_start:
gdt_null:
dd 0x0
dd 0x0
gdt_code:
dw 0xffff
dw 0x0
db 10011010b
db 11001111b
db 0x0
gdt_data:
dw 0xffff
dw 0x0
db 0x0
db 10010010b
db 11001111b
db 0x0
gdt_end:
gdt_descriptor :
dw gdt_end - gdt_start - 1
dd gdt_start
CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start
然后cpu运行如下指令:
cli
lgdt [gdt_descriptor]
mov eax,cr0
or eax,0x1
mov cr0,eax ;this will set the cpu to protected-mode
;jmp $ ;I use this instrction to find where is wrong
jmp CODE_SEG:init_pm
jmp $
[bits 32]
init_pm:
jmp $
mov ax,10
jmp $
mov ds,eax
mov ss,eax
jmp $
mov es,ax
mov fs,ax
mov gs,ax
mov ebp,0x90000
mov esp,ebp
call BEGIN_PM
指令jmp CODE_SEG:init_pm会导致cpu崩溃并重启。如果我把它改成jmp init_pm,下面的指令mov ax,10会导致cpu崩溃并重启。而且书上说切换操作需要跳远。
你能帮我做一下切换操作吗?
【问题讨论】:
-
我认为现代 CPU 可以让您利用
zif指令来避免崩溃。 -
先尝试reading OSDev,它涵盖了大部分基础知识。
标签: assembly protected-mode mbr real-mode gdt