分类: LINUX
2012-07-16 11:27:29
首先,电脑加电后cpu开始自身初始化,然后从某个固定位置(一般为0xFFFFFFF0)取指令开始执行,此指令为跳转指令,跳转到BIOS代码 首部。BIOS开始加电自检进行POSIX(power on self test),此阶段完成系统硬件检测,包括内存、系统总线检测等,然后BIOS读取启动设备第一个扇区(最开始的512字节信息),该扇区即为 MBR(Master Boot Record),MBR中保存了内核引导程序的开始部分。内核引导程序分为两部分,主引导程序和活动分区引导记录中的次引导程序。
MBR :
程序代码 446字节;
分区表 64字节;
检验位 2字节; 检验MBR是否有效
主引导程序扫描分区表,寻找活动分区,将位于活动分区引导记录中的次引导程序加载到内存并执行,次引导程序负责加载内核映像,并将控制权交给内核。 PC内核引导程序常用的有LILO(Linux Loader)和GRUB(Grand Unified Boot Loader),嵌入式中常用的引导程序有U-Boot和RedBoot。
内核在获取控制权后开始工作。内核映像以压缩文件形式存储,并可以直接执行,因此内核最开始的工作就是解压自己。内核编译后生成的是 Vmlinux,然后压缩程zImage(小内核,小于512KB)或bzImage(大内核,大于512KB),在二者头部都内嵌解压代码。
例i386映像得bzImage的调用:
start() arch/i386/boot/head.s
startup_32() arch/i386/boot/compressed/head.s
decompress_kernel() arch/i386/boot/head.s
startup_32() arch/i386/kernel/head.s
start_kernel() init/main.c
首先执行arch/i386/boot/head.s的start汇编例程,进行硬件设置,然后调用startup_32()设置基本的运行环境 (堆栈等),并清除BSS(Block Started by Symbol),然后调用decompress_kernel将内核解压到内存中,然后调用另一个startup_32函数对页表进行初始化,启用内存分 页功能,并为任何可选的浮点单元(FPU)检测CPU类型将其存储起来以后使用,然后调用init/main.c进入内核初始化。
总结一下就是cpu加载BIOS,BIOS加载内核引导程序,内核引导程序解压内核映像并加载。