U-boot简介
U-boot是一种Bootloader,Bootloader代码是嵌入式系统复位后进入操作系统前执行的一段代码。通过Bootloader的代码初始化处理器的各寄存器以及其他外部设备,建立存储器映射图以及初始化堆栈,为操作系统提供基本的运行环境。
U-boot工程结构分析
U-boot源代码树结构如下表所示:
子目录名 | 作用 |
---|---|
board | 开发板相关的定义和结构 |
common | 包含U-boot用到的各种处理函数 |
cpu | 各种不同类型的处理器相关代码 |
doc | U-boot文档 |
drivers | 常用外部设备驱动程序 |
examples | 存放U-boot开发代码样例 |
fs | 文件系统有关的代码 |
include | U-boot用到的头文件 |
lib_arm | ARM体系结构有关的数据定义和操作 |
lib_generic | U-boot通用的操作函数 |
net | 常用的网络协议,包括bootp、rarp、arp、tftp |
post | 上电自检相关代码 |
rtc | 实时时钟有关操作 |
tools | U-boot有关的数据代码 |
这里仅列出了主要的目录;部分子目录详解如下:
1)board目录存放与开发板有关的文件,该目录包括每个子目录至少提供Makefile和u-boot.lds两个文件,用来设置文件编译的方式以及开发板的硬件资源。
2)common目录是与体系结构无关的文件,包括实现各种命令的c语言源代码文件。
3)cpu目录存放与CPU相关的文件,在每个特定的子目录下都包括cpu.c、interrupt.c、start.S这三个文件,这三个文件是CPU初始化以及配置中断的代码。
4)tools目录存放U-boot编译过程中用到的一些工具代码。
U-boot总体工作流程
与大多数Bootloader类似,U-boot的启动分成stage1和stage2两个阶段。stage1使用汇编语言编写,通常与CPU体系紧密相关,如处理器初始化和设备初始化代码等,该阶段在start.S文件中实现。使用汇编语言编写占用空间小而且执行速度快。stage1负责建立stage1阶段使用的堆栈和代码段,然后复制stage2阶段的代码到内存。stage2阶段一般包括初始化Flash器件、检测系统内存映射、初始化网络设备、进入命令循环、接受用户从串口发送的命令然后进行相应的处理。stage2使用c语言编写,用于加载操作系统内核,该阶段主要是board.c中的start_armboot()函数实现。U-boot中stage1工作流程如下图:
U-boot启动流程分析
如图为U-boot在ARM处理器的启动步骤:
U-boot的启动代码分布在start.S、low_level_init.S、board.c和main.c文件中。其中start.S是U-boot整个程序的入口,该文件使用汇编语言编写,不同体系结构的启动代码是不同的;low_level_init.S是特定开发板的设置代码;board.c包含开发板底层设备驱动;main.c是一个与平台无关的代码。