CPU加电即进入16位实模式
硬件逻辑设计为加电瞬间强行设置:CS=0xF000,IP=0xFFF0,CS:IP=0xFFFF0
而BIOS程序的入口地址即0xFFFF0,是计算机上电后CPU执行的第一条指令的地址
BIOS程序在内存中加载中断向量表和中断服务程序
调用INT 0x19中断,将软盘第一扇区(0面0磁道1扇区)的512字节即bootsect.s加载到内存0x07C00处
bootsect.s将自身复制到0x90000~0x90200,ds:si -> es:di
rep指令重复256次,一次复制4字节即双字,复制结束后便跳过去,跳时指定了段和偏移(段内偏移实际没变)
调用INT 0x13中断,将setup.s对应的程序加载到0x90200处,共四个扇区2K
再通过INT 0x13中断,将system加载到0x10000
检查根设备
然后跳到setup.s的第一行指令
可见,bootsect主要完成的是搬运加载工作
setup程序的第一件事是利用BIOS中断服务程序将机器系统数据加载在原bootsect的位置(覆盖),0x90000~0x901FD,在setup前只空了2个字节
关中断,将system从0x10000复制到0x00000
设置全局描述符表(将来存放LDT和TSS)以及中断描述符表,GDT -> GDTR,IDT -> IDTR,注:setup.s从0x92000开始,gdt段内偏移相对0x90000要加上512
打开A20,实现32位寻址
建立保护模式下的中断机制,设置中断控制器8259A,保留内部不可屏蔽中断0x00~0x1F,重新映射中断号,IRQ0为0x20
将控制寄存器CR0的第0位PE置1,打开保护模式(之后要根据GDT)
跳到GDT的1项指向的地址开始执行,即head.s
参考:《Linux内核设计的艺术》