1 BIOS stage
当你Power On 电源后,PC会Reset所有的hardware register ,并从一个特定的地址执行代码。这个地址和硬件有关,对于IBM PC ,是0xFFFFFFF0,此时CPU在实模式下运行,CS= F000 ,IP = FFFF0 .
BIOS ROM的地址是F0000H~FFFFFH,这个是通过硬件接线来完成的,可以参考以前的单片机地址解析。
BIOS实际上是一段存储在ROM里的程序。它包含了一系列可以被某些操作系统调用,
用于处理计算机各种硬件设备的中断驱动和低级程序。
在FFFF0处的代码是JMP XXX , XXX为BIOS ROM启动程序的首地址。
然后执行POST(Power On self Test),自检。包括了检查RAM,keyboard,显示
器,软硬磁盘等等,这些动作是由系统测试码(system test code)来执行的,然后初始化硬件。
下一步根据CMOS 的设置定义的顺序来搜索处于活动状态并且可以引导的设备。也就是我们在CMOS中定义的
先从光盘启动,再从Hard Driver ,最后Floppy 等等。
如果是从硬盘启动,那么它将load MBR(位于磁盘的第一个扇区,0磁头0磁道1扇区,大小512字节)。将它装载
在内存地址0000:7c00处。
检查(WORD)0000:7dfe是否等于0xaa55.若不等于则转去尝试其他介质;如果没有其他启动介质,
则显示 “No ROM BASIC” ,然后死机。
2 MBR
BIOS Stage后,将JMP 0000:7C00执行程序,也就是MBR程序,MBR分为两部分,第一部分446字节,
主boot loader,它里面就包含有可执行代码以及错误消息文本,第2部分64字节,分区表,其中包含
有四个分区的各自的记录(一个分区占16字节),分别为分区类型(1),分区的开始地址(3字节,面/扇区/道),
分区的操作系统类型(1字节),分区的end address(3 bytes),分区的start logic 扇区(4 bytes)以及
该分区占用的总扇区数(4 bytes)。最后2个字节为结束标记,0xAA55 (magic number in electronic ??)
The main boot loader parst the DPT and find the active partition and assure the other partition are not
active . Then the boot record will load into RAM from the active partition .
如果用Grub,它的stage1即为MBR.
3 stage1.5
在/boot/grub/目录中,可以看到很多stage1.5,其中e2fs_stage1_5为ext2 file system ,因为stage1不能识别File
System ,所以其他的stage1.5认识某个File System ,他们的位置紧接MBR之后.
通过stage1.5 , 将stage2装载
4 stage 2
它是Grub的核心,根据/boot/grub/grub.conf读入菜单,实现多操作系统的启动.加载linux 内核
5 setup()
在 /usr/src/linux-2.4.2/arch/i386/boot/setup.S。链接程序把setup()函数代码紧跟在内核中所集成的引导装入程序之后,
位置为0x00090200,它以自己的方式初始化设备,为了可移植和健壮性。
change from real mode to protected mode .
jmp startup_32()
6 startup_32()
it will call decompress_kernel() to decompress the kernel image .then jmp to 0x100000
(zImage(<512KB) or bzImage (>512KB))
the secode startup32() will call start_kernel()
7 start_Kernel()