实模式进保护模式

在写自己的操作系统时,不能总在实模式下,进入保护模式才是”正道”,不过怎么进入保护模式又是一个问题,我把

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 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>