一.Bootloader与嵌入式linux的关系
一个嵌入式系统从软件角度来看分为四个层次:
1.引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。
2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。
3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。通常用 ram disk 来作为 root fs。
4. 用户应用程序。特定于用户的应用程序。
二、 Boot Loader 的概念
简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通 过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
Boot Loader 的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
通常,Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。
Boot Loader 的安装媒介
系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。
四. Boot Loader 的主要任务与典型结构框架
Boot Loader 的启动过程可分为单阶段(Single Stage)和多阶段(Multi-Stage)两种
通常多阶段的 Boot Loader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 Boot Loader 大多都是 2 阶段的启动过程,也即启动过程可以分为 stage 1和 stage 2 两部分。
stage1完成初始化硬件,为stage2准备内存空间,将stage2复制到内存中,设置堆栈然后跳转到stage2
一个同时装有 Boot Loader、内核的启动参数、内核映像和根文件系统映像的固态存储设备的典型空间分配结构图 :
多阶段的 Boot Loader
Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序):
·硬件设备初始化。 ·为加载 Boot Loader 的 stage2 准备 RAM 空间。 ·拷贝 Boot Loader 的 stage2 到 RAM 空间中。 ·设置好堆栈。 ·跳转到 stage2 的 C 入口点。
Boot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序):
·初始化本阶段要使用到的硬件设备。 ·检测系统内存映射(memory map)。 ·将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中。 ·为内核设置启动参数。 ·调用内核。
bootloader 的 stage2 可执行映象刚被拷贝到 RAM 空间时的系统内存布局
一、Broadcom Bootloader基本架构
大致可以分为三部分:
1、固件部分。这部分即为stage1,为加电或复位后CPU执行的最开始的指令地址。它不会被加载进RAM,只初始化硬件, 以及将mini-loader加载进内存
2、mini-loader部分。这部分主要任务是将CFE加载进内存,并且解压
3、CFE部分。这部分进行硬件环境初始化,并且进行image的更新,以及加载kernel
二、Broadcom Bootloader引导过程代码分析
(一)加载Mini-loader
Broadcom Bootloader在系统加电以后从 src\shared\boot.S 中的第一行代码开始执行
boot.S文件的主要任务有:
1.判断芯片类型
2.设置时钟
3.缓存的初始化
4.把Mini-loader加载进RAM
5.C跳转,即进入Mini-loader中执行c_main函数
二)执行Mini-loader
文件:src\shared\load.c
函数名:c_main()
{
…系统初始化…
load();//加载CFE,并解压缩;
…….
((void (*)(void)) LOADADDR)(); //跳转到CFE中执行CFE_main()
}
(三)执行CFE
文件:src\cfe\cfe\main\cfe_main.c
函数名:cfe_main()
主要功能:完成硬件的初始化,包括ether driver,PCI,console等外部设备的初始化,image更新,引导kernel等
void cfe_main(int a,int b)
{
……
board_console_init(); //硬件初始化,包括LED的初始化
cfe_say_hello(); //CFE开始信息
board_device_init(); //设备初始化,包括ether driver等设备
cfe_startup_info(); //输出环境信息,例如存储空间使用情况
cfe_init_ui(); //UI接口的初始化,包括console命令行初始化
board_final_init(); //硬件部分初始化
cfe_autostart(); //image更新,加载kernel
cfe_command_loop(); //如果上一步按了Ctrl-c,则在此循环执行
……
}
ui_docommand(“boot…” );
Ui_cmd_boot()
ui_cmd_bootcommon(cmd,argc,argv,flags)
cfe_boot(la->la_loader,la)
cfe_go(la)
cfe_start(la->la_entrypt)
cfe_launch(ept)
进入Kernel执行
阅读(1215) | 评论(0) | 转发(0) |