为什么需要uboot
嵌入式linux的启动与android启动阶段相同,上电后开始执行BootLoader(bootloader的种类有很多但99%都是使用的uboot),uboot初始化ddr和flash,将flash中的系统(OS)读取到ddr中,再跳转到ddr中启动OS,完成后uboot就停止了。
uboot到底要干什么
自己要能启动,所以uboot以汇编开始,后去构建c的环境;
终极目标就是启动操作系统内核,并给内核传参,由于两则工作的时间段不一样,在内核启动时,uboot已经停止,不能直接传参,因此两则共同约定了一片内存空间,boot将参数放在约定的内存中,等内核启动后就到约定的地方去取,这类参数主要是用来控制内核的启动的一些细节东西。
部署计算机系统(通过boot把kernel、footfs、等烧录到flash中,如其中的fasboot功能);
部分硬件管理,如操作flash和ddr、显示器、键盘……;
提供人机交互的命令行;
uboot的发展历程
uboot最早是一个德国人发明的,是他做自己的项目时需要用到bootloader,然后就写了个uboot,并将源码共享在网上,被很多人使用的同时对uboot进行完善,逐渐在行业里普及,最终生产芯片的厂家也开始支持uboot,所以uboot在bootloader使用越来越多,以至于目前大家的bootloader基本都使用uboot。
uboot的版本号
早期使用数字表达版本如uboot1.3.4;现在是使用日期标识版本如 boot-2016-06或boot-2016-06-rc1。带有rc的是临时版本,没有rc的是正式版本。
uboot的生命周期
始于内存,结束于内核。芯片内置代码如BL0-BL1将uboot搬到内存中,再跳转到内存执行。
uboot下的环境变量
环境变量可以认为是操作系统的全局变量,是uboot运行时的配置文件,环境变量是在flash中单独定义了一段空间专门用于存储环境变量,由于存储在flash中,所以掉电后数据仍然能保存,这点与全局变量不同,
uboot常用命令
print打印所有环境变量;
print name1 name2 name3打印name1 name2 name3 环境变量
set
可带参数,作用是修改环境变量的值;修改后需要saveenv保存;
save
无参数,作用是保存环境变量到flash,修改环境变量时只是内存中的环境变量,不是flash,所以需要保存;环境变量的保存时所有的覆盖保存。
bdinfo
无参数,打印所有板载信息
arch_number = 0x00000998 //机器码
env_t = 0x00000000
boot_params = 0x30000100 //传参给kernel的内存地址
DRAM bank = 0x00000000 //第0片DRAM(DDR)
-> start = 0x30000000 //DDR起始地址
-> size = 0x10000000 //DDR大小
DRAM bank = 0x00000001