嵌入式系统工程师2u-boot应用分析3大纲常用嵌入式Bootloader介绍u-boot介绍配置编译控制命令命令实现启动过程模块分析4u-boot应用分析常用嵌入式Bootloader介绍u-boot介绍配置编译控制命令命令实现启动过程模块分析5常用嵌入式Bootloader介绍vivi简介:vivi是由韩国MIZI公司开发的专门用于ARM产品线的一种Bootloader,主要参考Linux2.4内核开发特点:主要支持Samsung系列芯片,命令简单方便,其配置原理与编译过程与Linux非常相似,通过对其源码的分析可以加深对Linux配置过程的理解功能:初始版本只支持串口下载,速度较慢,在网上出现了各种改进版本,主要支持:常见的串口协议、网络协议、USB下载、YAFFS镜像烧写等6常用嵌入式Bootloader介绍HBOOT简介:HTC智能手机中常用的Bootloader,也可能是前几种Bootloader的一种或者几种的融合体,被HTC定制,是典型的两阶段启动,分别是:IPL和SPL。IPL:即InitialProgramLoader,是硬件上电后启动第一段程序,负责最初硬件(NandFlash,CPU,SDRAM)初始化,然后再把SPL程序装到RAM指定位置。SPL:完成更多更复杂的硬件初始化,且往往支持很多复杂命令,比如网络、USB下载(fastboot线刷)、SD升级(卡刷)等,最终将操作系统装入到RAM中运行。特点:主要支持HTC系列手机7常用嵌入式Bootloader介绍PPCBoot简介:是德国DENX小组开发的用于多种嵌入式CPU的Bootloader引导程序,主要由德国工程师WolfgangDenk和Internet上的一群自由开发人员对其进行维护和开发特点:支持PowerPC、ARM、MIPS、M68K等多种处理器平台,易于裁剪和调试ARMBoot简介:armboot主要是针对ARM或者StrongARMCPU等相关嵌入式系统所设计的特点:它支持多种类型的Flash,网络下载协议支持bootp和tftp8常用嵌入式Bootloader介绍u-boot简介:u-boot最初是由PPCBoot发展而来的,可以引导多种操作系统、支持多种架构的CPU,它对PowerPC系列处理器的支持最为完善,而操作系统则对Linux系统的支持最好目前已成为Armboot和PPCboot的替代品特点:主要支持操作系统:Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS等主要支持处理器架构:PowerPC、MIPS、x86、ARM、NIOS、XScale等u-boot目前最新版本是:应用分析常用嵌入式Bootloader介绍u-boot介绍配置编译控制命令命令实现启动过程模块分析10源码目录目录结构介绍:board:开发板相关,根据厂商进行分类,如当前平台board\samsung\unsp210,包含第一阶段要用到的一些初始化程序:lowlevel_init.Scpu:体系结构相关,按架构进行分类,如当前架构cpu\s5pc11x,第一阶段启动代码start.S就在这里common:各种命令的实现,通常一个命令就是一个C文件include:各种头文件和开发板配置文件,如include\configs\unsp210.h11源码目录目录结构介绍:api/api_examples:用于演示测试用的代码,通常不参与工程编译disk:硬盘接口程序,disk驱动分区处理代码,嵌入式不常用doc:开发使用文档,主要介绍不同平台的配置编译方法drivers:设备驱动,如:网卡、SD卡、USB等examples:一些独立运行的实例,通常不参与工程编译fs:所能支持的文件系统,如fat、ubifs等,用于访问带文件系统的存储设备12源码目录目录结构介绍:lib_arm:用于存放平台依赖文件,如第二阶段代码入口(start_armboot())、中断处理、启动相关等,其它以“lib_”开头的也是类似lib_generic:存放通用且不依赖于平台的库,如一些C库,终端操作接口等nand_spl:一些配置参考文件net:独立于网卡驱动的网络协议,如用于下载传输的TFTP协议,网络文件系统中的NFS协议等onenand_bl1:onenand启动的第一阶段代码onenand_ipl:onenand启动时,IPL和SPL过程中的第一个过程,即初始化阶段13源码目录目录结构介绍:post:上电自检程序,与旧的PPC相关,当前平台下未编译到工程sd_fusing:一些操作SD卡的脚本,主要用于制作SD引导启动相关tools:工具软件,如mkimage用于制作内核镜像,scripts用于生成指定的config.mk配置文件,还有支持GDB的调试工具等14配置编译u-boot的配置编译需要经过以下步骤:1、在u-boot的根目录下执行:#makeunsp210_config//对应开发板配置Makefile会构建编译结构,如:架构、cpu、开发板、厂商、芯片、目录等,为下一步真正编译链接做准备。2、修改include/configs/unsp210.h配置文件3、在根目录下执行:make根据以上两步产生编译和连接所需文件的信息最终make完成,在根目录下将生成:u-boot.binu-boot.disu-boot.map……配置过程如下:15配置编译上图和右图为顶层目录Makefile部分截图:右图为顶层目录mkconfig部分截图:16配置编译继续执行顶层目录mkconfig创建新链接17配置编译下图为顶层目录mkconfig部分截图:下图为include/config.mk截图:18配置编译环境变量的引用:上图为顶层目录Makefile部分截图:19配置编译添加平台头文件(unsp210.h),可以根据当前平台进行修改20配置编译链接过程如下:链接地址定义在board/samsung/unsp210/config.mk链接脚本定义在board/samsung/unsp210/u-boot.ldsboard/samsung/unsp210/config.mk被顶层config.mk包含并设置链接选项LDFLAGS21配置编译编译过程部分截图:LDFLAGS将在顶层Makefile最终链接时发挥作用22配置编译最终通过二进制工具去掉ELF格式信息,得到下载可直接运行的二进制文件:u-boot.bin23u-boot应用分析常用嵌入式Bootloader介绍u-boot介绍配置编译控制命令命令实现启动过程模块分析24控制命令在启动过程中快速按下空格或回车键可进入下载模式,否则会自动执行事先内置的一条命令引导启动系统。进入下载模式:输入help,可显示所有支持的命令详细可参见《常用U-boot命令详解.mht》这里我们只介绍最常用的命令u-boot的命令非常多,且操作非常的灵活,主要分为以下几类:25控制命令串口下载类指令网络命令NANDFLASH操作类环境变量类指令系统引导指令脚本运行指令USB操作指令SD卡(MMC)指令FAT文件系统指令26控制命令环境变量设置命令u-boot中采用环境变量来协调各命令工作时所需的参数及数据环境变量可以记录Bootloader在运行过程中用到的可配置参数列表,以及需要传递给内核的参数用户可以通过printenv、setenv、saveenv进行查看、设置、保存这些参数如:#printenv#setenvbootdelay8#saveenv#reset27控制命令u-boot提供的环境变量主要有:bootdelay执行自动启动的等候秒数baudrate串口控制台的波特率netmask以太网接口的掩码ethaddr以太网卡的网卡物理地址bootfile缺省的下载文件bootargs传递给内核的启动参数bootcmd自动启动时执行的命令serverip服务器端的ip地址ipaddr本地ip地址28控制命令下载命令下载地址:下载地址是为了方便系统更新时,明确镜像放在存储设备的什么位置用户可以通过各种下载协议完成系统镜像资源到磁盘指定位置的更新u-boot需要用户手动指定分区地址,分区信息可以参考内核启动时的打印信息或内核源代码:29控制命令为了保证Bootloader将控制权交给内核以后,内核能成功加载应用程序,在Linux内核驱动中也有一张分区表,且必须和Bootloader下载镜像的地址相同,如图:30控制命令Loady/loadb命令通过y-modem、kermit协议将文件通过串口下载到内存中#loady0x40000000#loadb0x40000000使用USB命令下载(借助PC端fastboot.exe工具)#fastboot使用网络命令下载(使用交叉线连接电脑或接入同一局域网)先下载到内存再写到nand,下载时需要借助一个PC端TFTP工具(TFTP+DHCP_Server/tftpd32.exe)#ping192.168.220.x(电脑主机)31控制命令下面以一个完整的嵌入式系统更新流程为例,讲解如何使用官方u-boot自带网络协议命令更新整个系统:更新u-boot#tftp0x40000000192.168.220.x:u-boot.bin#nanderase0x00x100000#nandwrite0x400000000x00x100000更新内核zImage:#tftp0x40000000192.168.220.x:zImage#nanderase0x6000000x500000#nandwrite0x400000000x6000000x50000032控制命令更新cramfs根文件系统#tftp0x40000000192.168.220.x:rootfs.cramfs#nanderase0xE000000x6E00000#nandwrite0x400000000xE000000x6E00000更新yaffs格式根文件系统#tftp0x40000000192.168.220.x:rootfs.yaffs#nanderase0xE000000x6E00000#nandwrite.yaffs0x400000000xE000000xXXX(0xXXX是rootfs.yaffs实际大小)33控制命令简易网络下载命令:更新u-boot(u-boot.bin)#updateboot更新kernel(zImage)#updatekernel更新yaffs(rootfs.yaffs)#updateyaffs所有镜像统一更新#updateimage34控制命令系统启动方式方式一:#boot方式二:#nandread0x400000000x6000000x500000#bootm0x40000000方式三:通过环境变量自定义脚本:#setenvbknandread0x400000000x6000000x500000\;bootm0x40000000#runbk35u-boot应用分析常用嵌入式Bootloader介绍u-boot介绍配置编译控制命令命令实现启动过程模块分析36命令实现u-boot的每一个命令都是通过U_BOOT_CMD宏定义来实现的,这个宏在include/command.h头文件中定义。每一个命令定义了一个cmd_tbl_t结构体,结构体包含的成员变量有:命令名称、最大参数个数、重复次数、命令执行函数、用法、帮助。37命令实现所有命令都通过U_BOOT_CMD宏进行命令结构体的定义和初