0. 前言
本文以Exynos4412芯片为例,简要介绍了uboot的相关概念,并择重分析了BL2阶段的软件流程。
1. uboot简介
uboot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。
它的作用是进行系统引导(相当于BIOS)。它的目标包含以下两个方面:
- 支持多种嵌入式操作系统。如:Linux、NetBSD、VxWorks等。
- 支持多种嵌入式芯片架构。如:PowerPC、MIPS、x86、ARM等。
2. uboot硬件抽象
从uboot的设计目标中,我们可以得知uboot是一个跨平台、跨设备的引导程序,因此其对于硬件设备的抽象和封装就显得相当的重要。那么uboot是如何能以简介、高效的方式移植于不同的平台呢?它的解决方案是“board->machine->arch->cpu”框架。
- ARCH:以指令集架构作为区分标准,对应于不同的CPU系列。
- CPU:对应于IP Core的概念。
- Machine:对应于SOC。指一些专业应用的场景,芯片厂商会在芯片上集成DSP、RAM、FLASH等外部器件,这些集成了其它功能的芯片被称为SOC。
- Board: 对应于需要移植的单板。
3. BL2介绍
BL2是执行在iRAM中的代码,负责初始化CPU Core,系统时钟和DRAM控制器等,并负责将uboot的镜像拷贝到内存中。它可以解决iRAM空间较小的问题(iRAM只有256KB),衔接BL1和uboot阶段。
BL2由工具mkbl2生成,参看脚本sd_fusing.sh可知BL2实际上就是由uboot的前14K代码组成。
4. BL2软件流程
- 橘黄色部分为BL2和uboot阶段共有的代码。
- 紫色部分为BL2阶段特有的代码。
- 蓝色部分为uboot阶段特有的代码。
5. 详细流程
u-boot.lds
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
arch/arm/cpu/armv7/start.o (.text)
board/samsung/smdk4212/libsmdk4212.o (.text)
arch/arm/cpu/armv7/exynos/libexynos.o (.text)
*(.text)
}
- 系统的入口函数为_start。入口函数的具体地址由CONFIG_SYS_TEXT_BASE定义。
- uboot镜像的前三个二进制文件依次为start.o -> libsmdk4212.o -> libexynos.o,因此我们如果需要在BL2中增加新功能,应该放到这三个二进制文件中。