分类: LINUX
2009-05-02 11:11:03
Bootloader 即引导加载程序,是系统加电后运行的第一段软件代码。
熟悉x86体系结构的朋友肯定知道,x86平台上bootloader 是由 BIOS和位于硬盘MBR中的OS Bootloader(比如Lilo 和 Grub)组成的。BIOS完成硬件的检测和资源的分配后,将硬盘MBR中的bootloader读到系统RAM中,之后此bootloader 就会开始进行主导,将内核搬到内存中以及进行一些必要的初始化工作,之后跳到内核的入口地址来执行,这样内核就开始启动,也就是系统就启动起来了。
而嵌入式平台上就跟x86不一样了,但是很类似,而且因为不同的平台架构本身的特点,每种平台对应的bootloader做得事情会有所不同,相对x86平台,一般不会有bios(但是这些都不是绝对的,有一些平台也会有内嵌类似bios的启动程序),整个系统的引导加载都由存放在flash,rom等存储设备特定位置的bootloader来完成。如arm平台中的2410,2440,bootloader存在在flash中的0x0的地方,板子加电后,系统会将bootloader的最前面的4k代码通过硬件逻辑自动的装载到SRAM中,之后从SRAM中的0开始执行,在这4k的程序中会完成基本的硬件的初始化,将完整的bootloader搬到内存中,并跳转到ram中的bootloader来进行继续执行。
这里不得不插入一个话题,通过上面的介绍,细心的朋友就会产生一个疑问:为什么要有bootloader?既然bootloader只是作硬件的初始化并将内核引导起来,那为什么不直接将这段代码加到内核中,直接启动内核就完成所有的工作?实际上要将bootloader与内核整合在一起是完全可以做到的,但是如果这样作的話,内核就会失去他的通用性和灵活性,并且将bootloader与内核分开会更有利于开发和管理,将启动过程中与平台硬件相关的代码集合成bootloader,内核就可以集中处理那些平台通用的部分了(当然实际上并没有这么严格的划分,内核中还是会有一些平台相关的代码,不过已经算是比较通用的了)。
回到之前所说的,bootloader启动起来之后,通常会有两种操作模式:
就是一上电,bootloader进行相关的初始化之后就马上把内核启动起来,注意关键的地方在整个过程中没有用户的参与,这种其实也就是bootloader的默认处理,一般的产品设计ok进行最后的发布时,就会处于此种状态。
这种模式,大家肯定非常熟悉,就是大家在进行开发的时候所处的环境,我们经常使用的tftp, erase, cp.b 等命令将相关的bin,img文件烧到板子上,这种情况下其实就是处于bootloader的执行环境下,所以一定意义来说,大多的bootloader其实就是一个嵌入式操作系统,只是它的功能不强,不像linux的结构那么复杂,而且也不会支持多进程多线程处理。
现在bootloader的种类是非常多的,下面的表中列出了几种,关于bootloader的种类这里介绍的比较简单,因为知道有多少种并没有什么太大的作用,之所以在这里列出是为了介绍下面bootloader的分类。
这里的分类实际上是依据上面的bootloader的操作模式来进行划分的,根据一个系统是否支持上面的下载模式我们这里将bootloader划分为bootloader和monitor(这不是我划分的,恩,是从别人的文章中引述过来的,不过我觉得他说的很有道理), 这里”bootloader”是指只是引导设备与执行主程序的固件,而”monitor”是指不仅拥有bootloader功能的,还能够进入下载模式的固件。
Bootloader |
Monitor |
描 述 |
x86 |
ARM |
PowerPC |
LILO |
否 |
Linux磁盘引导程序 |
是 |
否 |
否 |
GRUB |
否 |
GNU的LILO替代程序 |
是 |
否 |
否 |
Loadlin |
否 |
从DOS引导Linux |
是 |
否 |
否 |
ROLO |
否 |
从ROM引导Linux而不需要BIOS |
是 |
否 |
否 |
Etherboot |
否 |
通过以太网卡启动Linux系统的固件 |
是 |
否 |
否 |
LinuxBIOS |
否 |
完全替代BUIS的Linux引导程序 |
是 |
否 |
否 |
BLOB |
是 |
LART等硬件平台的引导程序 |
否 |
是 |
否 |
U-boot |
是 |
通用引导程序 |
是 |
是 |
是 |
RedBoot |
是 |
基于eCos的引导程序 |
是 |
是 |
是 |
vivi |
是 |
专为三星的arm cpu设计的引导程序 |
否 |
是 |
否 |
从上面的表可以看出,很多的bootloader都不是monitor。现在国内进行开发大部分还是使用u-boot的,因此下面我们所说的bootloader都是指的u-boot。