练习三:
分析bootloader进入保护模式的过程。
在刚进入bootloader的时候,最先执行的操作分别为关闭中断、清除EFLAGS的DF位以及将ax, ds, es, ss寄存器初始化为0;
.globl start
start:
.code16
cli //关中断
cld //清除方向标志
xorw %ax, %ax //ax清0
movw %ax, %ds //ds清0
movw %ax, %es //es清0
movw %ax, %ss //ss清0
为何开启A20,以及如何开启A20?
-
为何开启A20:
初始时A20为0,访问超过1MB的地址时,就会从0循环计数,将A20 地址线置为1之后,才可以访问4G内存。打开A20之后,才能访问32位地址空间。
原理:
将A20线至于高电位,使得全部32条地址线可用。 -
打开流程:
首先是从0x64内存地址中(映射到8042的status register)中读取8042的状态,直到读取到的该字节第二位(input buffer是否有数据)为0,此时input buffer中无数据;
seta20.1: //等待8042键盘控制器不忙
inb $0x64, %al //从0x64端口中读入一个字节到al中
testb $0x2,