U-Boot简介
2011年03月23日
Uboot 是德国DENX 小组的开发用于多种嵌入式CPU 的bootloader 程序, UBoot 不仅仅支持嵌入式Linux 系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。UBoot 除了支持PowerPC 系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale 等诸多常用系列的处理器。
1 uboot顶层目录关系:
board
和一些已有开发板有关的文件。每一个开发板都以一个子目录出现在当前目录中,
子目录中存放与开发板相关的配置文件。它的每个子文件夹里都有如下文件:
makefile
config.mk
smdk2410.c 和板子相关的代码(以smdk2410 为例)
flash.c Flash 操作代码
lowlevel.s 初始化 SDRAM 代码
u-boot.lds 对应的连接文件
common
实现uboot 命令行下支持的命令,每一条命令都对应一个文件。例如bootm 命令
对应就是 cmd_bootm.c。
cpu
与特定CPU 架构相关目录,每一款Uboot 下支持的CPU 在该目录下对应一个子目录,
比如有子目录arm920t 等。cpu/ 它的每个子文件夹里都有如下文件:
makefile
config.mk
cpu.c 和处理器相关的代码
interrupts.c 中断处理代码
serial.c 串口初始化代码
start.s 全局开始启动代码
disk
对磁盘的支持。
doc:
文档目录
drivers
Uboot 支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI 的Flash、串口
和USB 等。
fs
支持的文件系统,Uboot 现在支持cramfs、fat、fdos、jffs2 和registerfs 。
Include
Uboot 使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对
文件系统支持的文件。该目录下configs 目录有与开发板相关的配置头文件,如smdk2410.h。
该目录下的asm 目录有与CPU 体系结构相关的头文件,asm 对应的是 asmarm.。
lib_xxxx
与体系结构相关的库文件。如与ARM 相关的库放在lib_arm 中。
net:
与网络协议栈相关的代码,BOOTP 协议、TFTP 协议、RARP 协议和NFS 文件系统的
实现。
tools:
生成Uboot 的工具,如:mkimage, crc 等等。
Uboot的层次关系如图
2 uboot 的启动过程及工作原理
大多数Boot Loader都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。 启动加载(Boot loading )模式:这种模式也称为" 自主" (Autonomous )模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 BootLoader的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。 下载(Downloading )模式:在这种模式下,目标机上的 Boot Loader将通过串口连接或网络连接等通信手段从主机(Host )下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 BootLoader保存到目标机的 RAM中,然后再被 BootLoader 写到目标机上的FLASH类固态存储设备中。BootLoader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader 的这种工作模式。 工作于这种模式下的Boot Loader通常都会向它的终端用户提供一个简单的命令行接口。UBoot 这样功能强大的Boot Loader同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。 Uboot的启动分为阶段 1(stage1)和阶段2(stage2)两大部分。依赖于CPU 体系结构的代码(如CPU 初始化代码等)通常都放在阶段 1 中且通常用汇编语言实现,而阶段2 则通常用C 语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
stage1 (start.s 代码结构)
u-boot 的stage1 代码通常放在 start.s 文件中,它用汇编语言写成,其主要代码部分如下:
(1) 定义入口由于一个可执行的Image 必须有一个入口点,并且只能有一个全局入口, 通常这个入口放在ROM(Flash)的0x0 地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
(2) 设置异常向量(Exception Vector) 。
(3) 设置CPU 的速度、时钟频率及中断控制寄存器。
(4) 初始化内存控制器
(5) 将ROM 中的程序复制到RAM 中。
(6) 初始化堆栈
(7) 转到RAM 中执行,该工作可使用指令ldr pc 来完成。
stage2(C 语言代码部分)
lib_arm/board.c 中的start_armboot 是C 语言开始的函数,也是整个启动代码中 C 语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数主要完成如下操作: (1) 调用一系列的初始化函数。
(2) 初始化Flash 设备。
(3) 初始化系统内存分配函数。
(4) 如果目标系统拥有NAND 设备,则初始化NAND 设备。
(5) 如果目标系统有显示设备,则初始化该类设备。
(6) 初始化相关网络设备,填写IP、MAC 地址等。
(7) 进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
整个启动流程如下图
2011年03月23日
Uboot 是德国DENX 小组的开发用于多种嵌入式CPU 的bootloader 程序, UBoot 不仅仅支持嵌入式Linux 系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。UBoot 除了支持PowerPC 系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale 等诸多常用系列的处理器。
1 uboot顶层目录关系:
board
和一些已有开发板有关的文件。每一个开发板都以一个子目录出现在当前目录中,
子目录中存放与开发板相关的配置文件。它的每个子文件夹里都有如下文件:
makefile
config.mk
smdk2410.c 和板子相关的代码(以smdk2410 为例)
flash.c Flash 操作代码
lowlevel.s 初始化 SDRAM 代码
u-boot.lds 对应的连接文件
common
实现uboot 命令行下支持的命令,每一条命令都对应一个文件。例如bootm 命令
对应就是 cmd_bootm.c。
cpu
与特定CPU 架构相关目录,每一款Uboot 下支持的CPU 在该目录下对应一个子目录,
比如有子目录arm920t 等。cpu/ 它的每个子文件夹里都有如下文件:
makefile
config.mk
cpu.c 和处理器相关的代码
interrupts.c 中断处理代码
serial.c 串口初始化代码
start.s 全局开始启动代码
disk
对磁盘的支持。
doc:
文档目录
drivers
Uboot 支持的设备驱动程序都放在该目录,比如各种网卡、支持CFI 的Flash、串口
和USB 等。
fs
支持的文件系统,Uboot 现在支持cramfs、fat、fdos、jffs2 和registerfs 。
Include
Uboot 使用的头文件,还有对各种硬件平台支持的汇编文件,系统的配置文件和对
文件系统支持的文件。该目录下configs 目录有与开发板相关的配置头文件,如smdk2410.h。
该目录下的asm 目录有与CPU 体系结构相关的头文件,asm 对应的是 asmarm.。
lib_xxxx
与体系结构相关的库文件。如与ARM 相关的库放在lib_arm 中。
net:
与网络协议栈相关的代码,BOOTP 协议、TFTP 协议、RARP 协议和NFS 文件系统的
实现。
tools:
生成Uboot 的工具,如:mkimage, crc 等等。
Uboot的层次关系如图
2 uboot 的启动过程及工作原理
大多数Boot Loader都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。 启动加载(Boot loading )模式:这种模式也称为" 自主" (Autonomous )模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 BootLoader的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。 下载(Downloading )模式:在这种模式下,目标机上的 Boot Loader将通过串口连接或网络连接等通信手段从主机(Host )下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 BootLoader保存到目标机的 RAM中,然后再被 BootLoader 写到目标机上的FLASH类固态存储设备中。BootLoader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用BootLoader 的这种工作模式。 工作于这种模式下的Boot Loader通常都会向它的终端用户提供一个简单的命令行接口。UBoot 这样功能强大的Boot Loader同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。 Uboot的启动分为阶段 1(stage1)和阶段2(stage2)两大部分。依赖于CPU 体系结构的代码(如CPU 初始化代码等)通常都放在阶段 1 中且通常用汇编语言实现,而阶段2 则通常用C 语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
stage1 (start.s 代码结构)
u-boot 的stage1 代码通常放在 start.s 文件中,它用汇编语言写成,其主要代码部分如下:
(1) 定义入口由于一个可执行的Image 必须有一个入口点,并且只能有一个全局入口, 通常这个入口放在ROM(Flash)的0x0 地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。
(2) 设置异常向量(Exception Vector) 。
(3) 设置CPU 的速度、时钟频率及中断控制寄存器。
(4) 初始化内存控制器
(5) 将ROM 中的程序复制到RAM 中。
(6) 初始化堆栈
(7) 转到RAM 中执行,该工作可使用指令ldr pc 来完成。
stage2(C 语言代码部分)
lib_arm/board.c 中的start_armboot 是C 语言开始的函数,也是整个启动代码中 C 语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数主要完成如下操作: (1) 调用一系列的初始化函数。
(2) 初始化Flash 设备。
(3) 初始化系统内存分配函数。
(4) 如果目标系统拥有NAND 设备,则初始化NAND 设备。
(5) 如果目标系统有显示设备,则初始化该类设备。
(6) 初始化相关网络设备,填写IP、MAC 地址等。
(7) 进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
整个启动流程如下图