1. 關(guān)中斷,并清除方向標(biāo)志,即將 DF 置“0”,這樣(E)SI 及(E)DI 的修改為增量掷豺。
2. 清零各數(shù)據(jù)段寄存器:DS、ES薄声、FS
3. 使能 A20 地址線
4. 建立全局描述符表
lgdt gdtdesc
movl %cr0, %eax
orl $CR0_PE_ON, %eax
movl %eax, %cr0
5.通 過 長 跳 轉(zhuǎn) 指 令 進(jìn) 入 保 護(hù) 模 式 当船。
ljmp $PROT_MODE_CSEG, $protcseg
6. 執(zhí)行完上面的這條匯編語句后,bootloader 讓 80386 從實模式進(jìn)入了保護(hù)模式。由于在訪問數(shù)據(jù)或棧時需要用 DS/ES/FS/GS 和 SS 段寄存器作為全局描述符表的下標(biāo)來找到相應(yīng)的段描述符,所以還需要對 DS/ES/FS/GS 和 SS 段寄存器進(jìn)行初始化,使它們都指向位于0x10 處的段描述符(即 gdt 中的數(shù)據(jù)段描述符)默辨。
# Set up the protected-mode data segment registers
movw $PROT_MODE_DSEG, %ax? ? ? ? ? ? ? ? ? ? ? # Our data segment selector
movw %ax, %ds? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # -> DS: Data Segment
movw %ax, %es? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # -> ES: Extra Segment
movw %ax, %fs? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # -> FS
movw %ax, %gs? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # -> GS
movw %ax, %ss? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # -> SS: Stack Segment