阅读linux0.11源码Boot部分很多次了,每次看着看着就晕了,主要是因为对X86芯片和汇编不熟悉;虽然赵炯博士的<<Linux内核完全注释>>讲的非常详细,网上资料也很多,但毕竟不是自己的东西,只有用自己的思维理解了才会记忆深刻。我就试着用自己的思路,也小结一下。
0. 加载步骤: Bois->bootsect.s->setup.s->(head.s->main.c)。(head.s->main.c合为system模块)
1. PC加电,80x86CPU处于实模式,从CS:IP=FFFF:0000处开始执行指令(CPU在上电或者复位时总是执行物理地址0xFFFF0处的代码)。
0xFFFF0地址是Bois的默认地址。Bios进入硬件自检(内存、硬盘、显卡...)
Bios最后将磁盘的第一个扇区(512字节的bootsect.s)读入内存绝对地址0x7C00处,并跳到这个地方去执行。
2. bootsect.s执行过程:
1).将自己移动到内存绝对地址0x90000开始处并继续执行;
2).将磁盘第2个扇区开始的4个扇区的setup.s模块(setup.s编译成)加载到内存0x90200(bootsect.s后面);
3).然后利用BIOS中断0x13取磁盘参数表中当前启动引导盘的参数,屏幕上显示“Loading system…”字符串;
4).将system模块加载到内存0x10000。(0x10000~0x8ffff);
5).确定根文件系统的设备号; 并保存其设备号于root_dev(引导块的508地址处);
6).跳转到setup.s程序的开始处(