一、bootloader代码
#计算机启动运行在实模式,主要经过以下几个步骤进入保护模式 .text #.code16表示16位代码段 .code16 .global start start: #1、将ds、es和ss段寄存器均设置成cs段寄存器的值,并将栈顶指针esp指向0x7c00,栈向低地址增长。这步操作其实也可省略,因为在16位代码段中还用不到其他段寄存器,在需要使用的时候再初始 #化也不迟。 movw %cs,%ax movw %ax,%ds # -> Data Segment movw %ax,%es # -> Extra Segment movw %ax,%ss # -> Stack Segment movl $0x7C00,%esp
#2、关中断,在后面我们在内存中会建立中断向量表,所以事先关好中断,防止在建表过程中来了中断,所以事先屏蔽,防止这种情况产生。 cli
#3、打开地址线A20。实际上若我们使用qemu跑这个程序时,A20默认已经打开了,但为了兼容性,最好还是手动将A20地址线打开,读者可以试一试将打开A20代码删去后,在保护模式(32位代码段#)下用回滚机制测试时是否仍然显示字符 #8042(键盘控制器)端口的P21和A20相连,置1则打开 #0x64端口 读:位1=1 输入缓冲器满(0x60/0x64口有给8042的数据) #0x64端口 写: 0xd1->写8042的端口P2,比如位2控制P21 当写时,0x60端口提供数据,比如0xdf,这里面把P2置1 waitforbuffernull1: #先确定8042是不是为空,如果不为空,则一直等待 xorl %eax,%e |