进入保护模式主要有三个步骤:
1.打开a20地址使能:
in al,0x92
or al,0000_0010B
out 0x92,al
2.构建GDT表,初始化出代码段、数据段、栈段的段描述符,确定各个段的起始地址,段的大小,以及访问权限等信息。
GDT表的第一项初始化为全0.
3.使能creg0的第0位
mov eax,cr0
or eax,0x00000001
mov cr0,eax
整个代码如下所示:
boot.inc
LOADER_BASE_ADDR equ 0x900
LOADER_START_SECTOR equ 0x2
;一一一一一一- gdt 描述符属性 一一一一一一-
G_4k equ 1_00000000000000000000000b
D_32 equ 1_0000000000000000000000b
L equ 0000000000000000000000b
AVL equ 000000000000000000000b
LIMIT_DATA equ 1111_0000000000000000b
LIMIT_CODE equ LIMIT_DATA
LIMIT_VIDIO equ 0000_0000000000000000b
P equ 1_000000000000000b ;当时这个位置成了0,导致发生错误,不能打开32位地址
DPL_USR equ 11_0000000000000b
DRL_OS equ 00_0000000000000b
S equ 1_000000000000b
TYPE_CODE equ 1000_00000000b
TYPE_DATA equ 0010_00000000b
;代码段高32