uboot(universal bootloader 通用启动代码)
1. 本质:裸机程序:上电就运行,独占CPU,启动内核就结束
2. 核心功能:启动系统内核
3. uboot是个开源项目,是bootloader标准
PC启动流程
1. BIOS程序由厂家烧录在主板(norflash)上(操作系统在硬盘)
2. BIOS初始化内存/硬盘
3. BIOS把操作系统从硬盘读到DDR
4. BIOS启动系统
5. BIOS结束
uboot启动流程
1. uboot程序/操作系统在flash上
2. uboot初始化内存/flash(这里会通过寄存器读取信息,判断是从Flash/SD卡/U盘等启动)
3. uboot把操作系统读到DDR
4. uboot启动内核,传参
5. uboot结束
6. 内核启动后加载根文件系统(这个不是uboot干的,uboot已经结束了)
uboot功能
1. 启动内核,传参(参数放到内存指定位置,内核再去取)
2. soc级(芯片级)驱动:flash驱动(初始化/读写),时钟/网络等硬件驱动
3. 烧录下载uboot/kernel/rootfs
4. 命令行工具(其实就是死循环读取行缓冲)
命令
help:帮助
print:即printenv,用来查看环境变量
set:即setenv,修改环境变量
save:即saveenv,保存环境变量
环境变量
格式:set name value
添加或修改环境变量:set a 1 # 如果环境变量a存在,则修改a=1,否则添加这个环境变量
删除环境变量:set a # 设个空值
注意:
1. 如果值是有空格或很长的字符串,用单引号括起来
2. 保存环境变量:set只对当前有效,uboot结束后,就没了。如果需要下次使用需要保存命令save
系统分区
一般对Flash划分位4个分区:uboot(1M)/uboot环境变量(32K)/kernel(5M)/rootfs,每个分区的大小自由分配
uboot直接启动(flash起始位置),再把uboot环境变量读取到内存中(这就是为什么我们set变量,但下次就没有了。save后才把内存中的环境变量写入到flash指定分区),再把kernel读到内存
下载
1. 先测试网络ping
2. tftp下载(网络)
a. tftp作为服务器,uboot作为客户端,直接把文件从tftp服务器下载到指定内存地址(注意:uboot没有内存管理,注意内存的覆盖,内核启动后由内核管理)
b. 设置环境变量
serverip:tftp服务器地址
ipaddr:本机地址(要和tftp服务器同网段)
netmask:子网掩码
getewayip:网关
ethaddr:网卡mac地址
c. 下载到内存中:tftp 0x30000000 xxx
d. 从内存保存到flash:movi
3. fastboot下载(usb)
内存操作
movi read:从flash读到内存
movi write:从内存写入flash
movi write u-boot 0x30000000
mm:修改内存值
mw:写内存值
md:显示内存值
把zImagecopy到/tftp下
tftp 31000000 zImage
nand erase 200000 300000(offset size)
nand write 31000000 200000 300000(内存addr offset size)
启动内核
命令:bootm(从指定地址启动内核,可传参)/go(不传参)
环境变量:
bootdelay:倒计时
bootcmd:自动运行命令
bootargs:启动参数
示例
启动命令:
bootcmd=load mmc 0:1 0x41800000 sun8i.dtb; load mmc 0:1 0x41000000 zImage; bootz 0x41000000 - 0x41800000
启动参数:
bootargs=console=ttyS0,115200 panic=5 console=tty0 rootwait root=/dev/mmcblk0p2 earlyprintk rw
console:控制台输出
root:根文件系统在flash的第2分区
rw:可读写
init:linux的init进程的路径
rootfstype:文件系统类型