关于Bootloader的作用,老师教我们把它当作PC的BIOS来理解,但其实不完全是这么回事。文章参考:
http://www.cnblogs.com/yashi88/archive/2010/02/11/1667548.html
http://hi.baidu.com/shaohua312/item/2284a71e318c1512e3f98636
BootLoader 是系统加电后运行的第一段代码。一般它只在系统启动时非常短的时间内运行。
在PC中,整个BootLoader由BIOS(主板上固化的一段程序)、位于硬盘MBR区的OS Loader一起组成。BIOS完成第一级引导加载工作,OS Loader完成第二级引导加载工作(可能有些系统不只两级加载)。上电后,系统开始执行BIOS中的代码,这段代码负责进行硬件检测和资源分配,完成这步工作后,将按照CMOS中设定的顺序检索硬盘。BIOS将第一个检索到的硬盘上MBR中的内容读到系统RAM中,然后将系统控制权交给相应的OS Loader。最后由OS Loader负责将所要引导的操作系统的内核映象从硬盘上读到系统RAM中,然后跳转到内核的入口点上。
而在嵌入式中,通常不存在BIOS那样的一段固定内容的固化的程序。原因是PC平台尽管品牌等有差异,但通常都有相近甚至是相同的体系结构,遵循一个共同的工业标准,因而可以使用同一个BIOS代码来引导。而通常对嵌入式系统来说,即使是使用相同的架构,甚至是同一个CPU来构建,但因为并不能遵循的一个共同的工业标准。因而在嵌入式系统上除非两者的各方面与引导过程相关设计完成一致,否则不能使用同一个BootLoader。
其实Bootloader主要的必须的作用只有一个:就是把操作系统映像文件拷贝到RAM中去,然后跳转到它的入口处去执行,我们称之为启动加载模式,该过程没有用户的介入,是它正常工作的模式。它的步骤如下:
Stage1:
1. 硬件设备初始化。为stage2的执行及随后内核的执行准备好基本的硬件环境
2. 为加载stage2 准备ram空间。为了获得更好的执行速度,通常吧stage2加载到ram中执行
3. 复制stage2的代码到ram中
4. 设置好堆栈
5. 跳转到stage2的c程序入口
Stage2:
1. 初始化本阶段要使用的硬件设备
2. 检测系统内存映射
3. 将内核映像和根文件系统映像从flash读到ram中
4. 为内核设置启动参数
5. 调用内核
然而,在嵌入式开发中,经常需要为一个嵌入式的硬件系统下载新的Bootloader,操作系统(内核,根文件系统系统)等,此时用到的是Bootloader的下载功能,我们称之为下载模式,该过程有用户的介入。我在使用uboot的过程中,发现它提供了基于usb的下载(pc端的dnf),也有基于网络的下载(我的开发板uboot启动的时候开发板就已经有局域网的ip地址了,网卡已经被驱动了,uboot提供了基于tftp协议的下载,还有其它查看内存,格式化存储器等功能)。
关于串口终端显示的信息是不是由Bootloader提供的,我搜索了一下,没找到相关信息。但我个人认为串口终端的信息也是Bootloader提供的,用于与用户交互。
所以说,Bootloader并不是可以完全简单的理解为pc的BIOS。它完成了BIOS+OSLoader的功能,同时向开发人员提供系统运行的信息及调试信息,提供了下载功能,及其它辅助功能。
下面这段纯粹copy过来的
bootloader是不是必须的:
Bootloader并不是必须的,如果我们的硬件有足够大的norflash,并且实现了XIP技术,那么WinCE 操作系统可以直接在norflash里面运行起来,不需要将它复制到RAM中去,所以Bootloader就失去了作用。
但是考虑到成本因素,现在的硬件一般都不会配置这么大的norflash,image文件都存储在nand flash里面,所以都会用到Bootloader。
附加说明一下PC上Linux的启动过程:
1.BIOS启动,初始化硬件,系统自检,假设BIOS设定为从硬盘启动(这里不考虑光盘,及其它可移动存储设备)
2.每个磁盘的首部都有一个MBR,记录了分区信息,还有引导程序,新的硬盘没有MBR,格式化之后就有了。系统找到硬盘的MBR,根据MBR里面的引导程序找到要启动的分区。附图一张,我常用的引导备份工具,:
3.根据MBR里面的引导程序,找到要启动的分区,每个分区首部都要一个PBR,PBR里边可能也有启动信息,根据MBR里边的程序来定。附两张图:
4.在指定的分区中加载Linux内核,启动操作系统。
附件:
U-Boot的常用命令详解.pdf
下载地址:
http://pan.baidu.com/share/link?shareid=135850&uk=3238766853