Chinaunix首页 | 论坛 | 博客
  • 博客访问: 39245
  • 博文数量: 7
  • 博客积分: 166
  • 博客等级: 入伍新兵
  • 技术积分: 100
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-03 10:11
文章分类

全部博文(7)

文章存档

2014年(1)

2012年(6)

我的朋友

分类: 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加载内核引导程序,内核引导程序解压内核映像并加载。

阅读(1058) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~