1. 关中断,并清除方向标志,即将 DF 置“0”,这样(E)SI 及(E)DI 的修改为增量。
2. 清零各数据段寄存器:DS、ES、FS
3. 使能 A20 地址线
get from ucore4. 建立全局描述符表
lgdt gdtdesc
movl %cr0, %eax
orl $CR0_PE_ON, %eax
movl %eax, %cr0
5.通 过 长 跳 转 指 令 进 入 保 护 模 式 。
ljmp $PROT_MODE_CSEG, $protcseg
6. 执行完上面的这条汇编语句后,bootloader 让 80386 从实模式进入了保护模式。由于在访问数据或栈时需要用 DS/ES/FS/GS 和 SS 段寄存器作为全局描述符表的下标来找到相应的段描述符,所以还需要对 DS/ES/FS/GS 和 SS 段寄存器进行初始化,使它们都指向位于0x10 处的段描述符(即 gdt 中的数据段描述符)。
# 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
网友评论