linux内核启动过程

今天去图书馆待了一晚,在一本书上看到了PC的启动过程的讲解。

首先,电脑加电后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加载内核引导程序,内核引导程序解压内核映像并加载。

posted on 2011-11-28 21:58  Eric.He.yeah  阅读(865)  评论(0)    收藏  举报

导航