什么是bootloader
Bootloader是硬件启动的引导程序,是运行操作系统的前提;
在操作系统内核或用户应用程序运行之前运行的一小段代码。对软硬件进行相应的初始化和设定,为最终运行操作系统准备好环境;
在嵌入式系统中,整个系统的启动加载任务通常由Bootloader来完成。
bootloader的特点
Bootloader不属于操作系统,一般采用汇编语言和C语言开发。需要针对特定的硬件平台编写。
在移植系统时,首先为开发板移植Bootloader。
Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。
bootloader的启动模式
自启动模式:在这种模式下,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
交互模式:在这种模式下,目标机上的Bootloader将通过串口或网络等通信手段从开发主机(Host)上下载内核映像和根文件系统映像等到RAM中。可以被 Bootloader写到目标机上的固态存储媒质中,或者直接进行系统的引导。也可以通过串口接收用户的命令。
常用的bootloader介绍
U-Boot是目前Bootloader中使用率最高的一种,特点是开源免费,应用广泛。U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。
u-boot特点
代码结构清晰、易于移植(见目录结构)
支持多种处理器体系结构(见arch目录)
支持众多开发板(目前官方包中有200多种,见board目录)
命令丰富、有监控功能
支持网络协议、USB、SD等多种协议和设备
支持文件系统
更新较活跃,使用者多,有助于解决问题
help 查看uboot支持的搜用命令
pri 或者 prientenv 查看uboot的环境变量
fs4412 # pri bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-origen.dtb;bootm 41000000 - 42000000 baudrate=115200 bootargs=root=/dev/nfs nfsroot=192.168.1.158:/home/linux/source/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.160 bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000 bootdelay=3 ethact=dm9000 ethaddr=11:22:33:44:55:66 fileaddr=42000000 filesize=D13D gatewayip=192.168.1.5 ipaddr=192.168.1.160 ipaddr192.168.31.5 netmask=255.255.255.0 serverip=192.168.1.158 stderr=serial stdin=serial stdout=serial tftp=41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000 Environment size: 681/16380 bytes
setenv 设置环境变量 此命令也可用于删除环境变量
setenv ipaddr //删除ipaddr变量
saveenv 保存环境变量
ping 检测网络是否联通
bootcmd 自启动命令,如果定义了该变量,在自启动模式下将会执行该环境变量中的命令。
U-boot # setenv bootcmd tftp 41000000 uImage\; bootm 41000000 U-boot # saveenv
bootm 用于运行内核
引导内核为内核传参,其中内核和ramdisk通常为mkimage处理过的二进制文件。
bootm kernel-addr ramdisk-addr dtb-addr bootm 41000000 - 42000000
tftp 通过网络下载程序
U-boot # tftp 41000000 application.bin //41000000 保存的内存地址 application.bin 要下载的文件
protect 对Nor Flash写保护 (Nor Flash造价贵 对内存位操作 读写速度快)
protect on 0 10000 对区间[0x0, 0x10000]进行写保护 protect off 0 10000 对上述区间取消写保护
erase 擦除Nor FLASH
erase all 擦除FLASH所有的扇区 erase 0 10000 把FLASH区间 [0x0, 0x10000]擦除
Nand Flash操作 (Nand Flash 造价便宜 对内存块操作 读写速度慢)
nand read addr off size nand write addr off size nand erase [clean] [off size]
movi init ---初始化eMMC并显示相关信息 movi read u-boot/kernel addr movi write u-boot/kernel addr movi read rootfs addr size movi write rootfs addr size 更多命令参考: https://blog.csdn.net/weixin_45309916/article/details/109178989 http://www.360doc.com/content/18/0406/16/32862269_743313535.shtml
loadb 通过串口下载二进制文件(裸机开发常用)
fs4412 # loadb 40008000
go 执行逻辑程序(逻辑开发常用)
fs4412 # go 40008000
/arch Architecture specific files
/arc Files generic to ARC architecture
/arm Files generic to ARM architecture
/m68k Files generic to m68k architecture
/microblaze Files generic to microblaze architecture
/mips Files generic to MIPS architecture
/nds32 Files generic to NDS32 architecture
/nios2 Files generic to Altera NIOS2 architecture
/powerpc Files generic to PowerPC architecture
/riscv Files generic to RISC-V architecture
/sandbox Files generic to HW-independent "sandbox"
/sh Files generic to SH architecture
/x86 Files generic to x86 architecture
/xtensa Files generic to Xtensa architecture
/api Machine/arch independent API for external apps
/board Board dependent files
/cmd U-Boot commands functions
/common Misc architecture independent functions
/configs Board default configuration files
/disk Code for disk drive partition handling
/doc Documentation (don't expect too much)
/drivers Commonly used device drivers
/dts Contains Makefile for building internal U-Boot fdt.
/env Environment files
/examples Example code for standalone applications, etc.
/fs Filesystem code (cramfs, ext2, jffs2, etc.)
/include Header Files
/lib Library routines generic to all architectures
/Licenses Various license files
/net Networking code
/post Power On Self Test
/scripts Various build scripts and Makefiles
/test Various unit test files
/tools Tools to build S-Record or U-Boot images, etc.
/arch 架构专用文件 支持的CPU都放在这里
/arc 通用于ARC架构的文件
/arm ARM 架构的通用文件
/m68k 通用于m68k架构的文件
/microblaze 通用于microblaze架构的文件
/mips 通用于MIPS架构的文件
/nds32 NDS32架构的通用文件
/nios2 Altera NIOS2架构的通用文件
/powerpc 通用于PowerPC架构的文件
/riscv 通用于RISC-V架构的文件
/sandbox 通用于独立于HW的 "沙箱 "的文件。
/sh 通用于SH架构的文件
/x86 通用于x86架构的文件
/xtensa Xtensa架构的通用文件
/api 独立于机器/架构的外部应用程序的API
/board 单板 一般是CPU厂商的demo版样机用的一些外设
/cmd U-Boot命令功能
/common 独立于架构的其他功能 比如一些命令pri tftp等
/configs 板卡默认配置文件
/disk 磁盘驱动器分区处理代码
/doc 文件(不要期望太高)
/drivers 常用的设备驱动程序
/dts 包含用于构建内部 U-Boot fdt 的 Makefile。
/env 环境文件
/examples 独立应用程序等的示例代码
/fs 文件系统代码(cramfs, ext2, jffs2等)
/include 头文件
/lib 适用于所有架构的库例程
/Licenses 各种许可证文件
/net 网络代码 放置一些网络协议
/post 开机自检
/scripts 各种构建脚本和Makefile
/test 各种单元测试文件
/tools 建立S-Record或U-Boot图像的工具等。
平台相关
arch, board, include…
平台无关
common, net, fs, drivers…
工具和文档
tools, doc
整个工程通过Makefile来组织编译。顶层目录下的Makefile中包含了开发板的配置信息。从顶层目录开始递归地调用各级子目录下的Makefile,最后链接成u-boot映像。
U-BOOT编译生成的映像文件有下列几种:
u-boot.map U-boot映像的符号表(方便源码跟踪)
u-boot U-Boot映像的ELF格式
u-boot.bin U-Boot映像原始的二进制格式(烧录用)
注意exynos4412需加入BL1 BL2
u-boot.srec U-Boot映像的S-Record格式
烧录编译产生的镜像 u-boot.bin
初次或开发板代码损坏不能正常启动时,可采用JTAG工具烧录
专用的烧录工具如h-jtag或DNW等
在u-boot已经能工作,升级或修正U-boot时,可用U-boot中的命令来烧录
其它方式 如SD卡 , Fastboot命令
镜像固化位置
ROM、NOR FLASH、NAND FLASH EMMC等