U-Boot简介

2019-07-13 01:39发布

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的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
  整个启动流程如下图