U-Boot简介

U-Boot简介

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的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

                            整个启动流程如下图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值