在写自己的操作系统时,不能总在实模式下,进入保护模式才是"正道",不过怎么进入保护模式又是一个问题,我把
XuOS里进入保护模式的代码分析一下.
; 装入GDT
mov eax,ds ;设置GDT在物理内存中的正确位置
shl eax,4
add [gdt_addr+2],eax
cli ; 关中断
lgdt [gdt_addr] ;载入GDT
; 下面打开A20地址线,这段代码可以在OSzone上找到相关解释.
call Empty_8042
mov al,0xd1
out 0x64,al
call Empty_8042
mov al,0xdf
out 0x60,al
call Empty_8042
; 进入保护模式
mov eax,cr0 ;置PE位
or eax,1
mov cr0,eax
jmp oscodesel:code_32 ; 跳到32位代码处执行
Empty_8042:
in al,0x64
test al,0x2
jnz Empty_8042
ret
; GDT的内容
gdt:
gdt_null:
dd 0x0000
dd 0x0000
gdt_system_code:
oscodesel equ $-gdt ; 段选择子
dd 0x0000ffff,0x00cf9a00
gdt_system_data:
osdatasel equ $-gdt
dd 0x1000ffff,0x00cf9200
videosel equ $-gdt
dd 0x0000ffff,0x00cf920a
gdt_addr:
dw gdt_addr-gdt-1
dd gdt ; ;GDT表的位置
当然,由于XuOS目前还比较简单,还没有设置IDT,GDT中段也比较少,况且我的理解也有可能有些偏差或者表述
有些不清楚,这里只提供一个思路,更多更强的功能还是要靠自己才行.
0 条评论。