分类: 嵌入式
2011-09-19 11:42:35
一个嵌入式系统从软件角度来看分为三个层次:
1. 引导加载程序
包括固化在固件(firmware)中的boot 程序(可选),和BootLoader 两大部分。
2. Linux 内核
特定于嵌入式平台的定制内核。
3. 文件系统
包括了系统命令和应用程序
BootLoader就是在操作系统运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。
在嵌入式系统中,通常没有像BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时都从地址0x00000000开始执行。而在这个地址处安排的通常就是系统的BootLoader程序。
每种不同的CPU体系结构都有不同的BootLoader。除了依赖于CPU的体系结构外,BootLoader 还依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,外设芯片的类型等。这也就是说,对于两块不同的开发板而言,即使它们是基于同一种CPU而构建的,但如果他们的硬件资源或配置不一致的话,要想在一块开发板上运行的BootLoader程序也能在另一块板子上运行,还是需要作修改,需要进行bootloader移植
BootLoader 的启动过程
BootLoader 大多采用两阶段,即启动过程可以分为stage 1和stage2:stage1完成初始化硬件,为stage2准备内存空间,并将stage2复制到内存中,设置堆栈,然后跳转到stage2。
Stage1通常包括以下步骤:
1. 硬件设备初始化
2. 为加载BootLoader的stage2凖备RAM空间
3. 拷贝BootLoader的stage2到RAM空间中
4. 设置好堆栈
5. 跳转到stage2的C入口点
Stage2通常包括以下步骤:
1.初始化本阶段要使用到的硬件设备
2.将内核映像和根文件系统映像从flash 上读到RAM中
3. 调用内核
Uboot 介绍
Uboot是德国DENX小组开发的用于多种嵌入式CPU( MIPS、x86、ARM、XScale等)的bootloader程序,UBoot不仅支持嵌入式Linux系统的引导,还支持VxWorks, QNX等多种嵌入式操作系统。从下面地址可以下载到uboot的源代码:
Uboot 编译
Uboot的Makefile从功能上可以分成两个部分:
1、执行每种board相关的配置
2、编译生成uboot.bin文件
Uboot.bin的生成也分为两步,以smdk2410为例来说明,如下:
1. 对于board进行配置:
$make smdk2410_config
2. 进行编译生成u-boot.bin:
$make CROSS_COMPILE=arm-linux
工作模式
大多数BootLoader都包含两种不同的操作模式:“启动模式” 和“下载模式”,这种区别仅对于开发人员才有意义,但从最终用户的角度看,BootLoader的作用就是用来加载操作系统,而不存在所谓的启动模式与下载模式。
- 启动模式
这种模式也称为“自主” 模式,是指BootLoader 从目标机上的某个固态存储设备上将操作系统自动加载到RAM 中运行,整个过程并没有用户的介入。这种模式是BootLoader 的正常工作模式
- 下载模式
在这种模式下,目标机上的BootLoader 将通过串口或网络等通信手段从主机(Host)下载文件,然后控制启动流程。
课件: UBOOT.pdf