您的位置:首页 > 其它

UBOOT

2016-11-18 19:29 63 查看

BootLoader

什么是BootLoader?简单的说,BootLoader就是在操作系统运行之前运行的一段小程序。通过这段小程序,可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。
软件层次:
一个嵌入式系统从软件角度来看可分为三个层次:
1.引导加载程序包括固化在固件(firmware)中的boot程序,和BootLoader的两大部分。
2.Linux内核:特定于嵌入式平台的定制内核。
3.文件系统:包括了系统命令和应用程序。

BootLoader安装:上电或者复位后,所有的CPU通常都从CPU制造商预先安排的地址开始执行。比如,S3C2410在复位后从地址处0x00000000起开始执行。而嵌入式系统则将固态存储设备(比如:Flash)安排在这个地址上,而bootloader程序又安排在固态存储器的最前端,这样就能包装在系统上电后,CPU首先执行bootloader程序。

BootLoader移植:
每种不同的CPU体系结构都有不同的BootLoader。
除了依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,外设芯片的类型等。这也就是说,对于两块不同的开发板而言,即使它们是基于同一种CPU而构建的,但如果它们的硬件资源或配置不一致的话,想要在一块开发板上运行的Bootloader程序也能在另一块板子上运行,还是需要作修改。

Bootloader流程:Bootloader的启动流程可分为单阶段和多阶段两种,通常多阶段的Bootloader具有更复杂的功能,更好的移植性。从固态存储设备上启动的Bootloader大多采用两阶段,即启动过程可以分为stage1和stage2:stage1完成初始化硬件,为stage2准备内存空间,并将stage2复制到内存中,设置堆栈,然后跳转到stage2。 

Bootloader的stage1通常包括以下步骤:
(1)硬件设备初始化
(2)为加载Bootloader的stage2准备RAM空间
(3)拷贝Bootloader的stage2到RAM空间中
(4)设置好堆栈(原因:)
(5)跳到stage2的C入口点

Bootloader的stage2通常包括以下步骤:
(1)初始化本阶段要使用到的硬件设备
(2)将内核映像和根文件系统映像从flash上读到RAM中
(3)调用内核



交叉工具链



UBOOT

进入到UBOOT目录,可以得到如下的目录结构:
board
common
cpu
disk
doc
drivers
dtt
examples
fs
include
lib_arm
lib_generic
lib_i386
lib_m68k
lib_microblaze
lib_mips
lib_nios
lib_nios2
lib_ppc
net
post
rtc
tools

Board:和开发板有关的文件,每一个开发板都以一个子目录出现在当前目录中,比如:board/samsung/smdk6410,子目录中存放与开发板相关的文件。

Common:实现Uboot支持的命令。

Cpu:与特定CPU架构相关的代码,每一款Uboot下支持的CPU在该目录下对应一个子目录,比如有子目录arm920t等。

Disk:对磁盘的支持。

Doc:文档目录,Uboot有非常完善的文档,推荐大家参考阅读。

Drivers:Uboot支持设备驱动程序都放在该目录下,比如各种网卡、支持CFI的flash、串口和USB等。

Fs:文件系统支持。

Include:Uboot使用的头文件。该目录下configs目录有与开发板相关的配置头文件,如smdk6410.h。该目录下的asm目录有与CPU体系结构相关的头文件。

Net:与网络协议栈相关的代码,例如:TFTP协议、RARP协议的实现。

Tools:Uboot的工具,如:mkimage,crc等等。

Uboot编译:

 

Uboot命令:尽管Uboot提供了丰富的命令集,但不同单板所支持的命令并不一定一样,help命令可用于查看当前单板所支持的命令。

命令:
printenv 查看环境变量
setenv 添加、删除、修改环境变量     setenv 环境变量名字 值//添加和修改         setenv 环境变量名字//删除环境变量
saveenv 保存环境变量,将当前定义的所有变量及其值存入flash中
tftp 通过网络下载文件 注意:使用tftp需要先配置好网络
md 显示内存区中的内容
mm修改内存,地址自动递增
nand info nand大小等信息
nand erase 擦除nand flash,在写入操作时,Nand Flash芯片的每一位只能从1变成0,而不能从0变成1,所以在其写入之前一定要将其相应块擦除,擦除即是将相应块的位全部变为1。用法:nand erase start length,擦除从start开始,长度为length
向nand flash 写入数据命令:nand write     用法:nand write [内存地址] [flash地址] length
从nand flash读出数据命令:nand read      用法:nand read [内存地址] [flash地址] length
执行程序命令:go,执行内存中的二进制代码,一个简单的跳转到指定地址,go addr [arg...],需要指明可执行程序的位置。
bootm 执行内存中的二进制代码,bootm [addr[arg...]],bootm不需要指明可执行程序的位置,要求二进制代码有固定格式的文件头。
bdinfo-显示开发板信息

自动启动:【6410】 setenv bootcmd tftp c0008000 ulmage \; bootm c0008000

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  嵌入式系统 u-boot