bootloader简述:
bootloade指的是内核引导程序,又被称为自举程序,是嵌入式系统在加电后执行的第一段代码。它完成了CPU和相关硬件的初始化,搬移操作系统(kernel/Linux)到内存中,从而能够运行操作系统,最终目的是为内核的启动准备环境。
bootloader分类:
由上图我们可以看出来,bootloader在整个系统加载的过程中起着至关重要的作用,但因为bootloader作用在非常底层的地方,所以根据不同的硬件架构,bootloader内核引导程序也会有种种区别,常见的有针对x86的 GRUB,针对ARM的 vivi 和 armboot ,还有支持多种架构的uboot。 其中uboot可能就是初学者最耳熟能详得了。uboot以自身可移植性高,功能丰富,开源可定制在众多bootloader中杀出重围。
bootloader之uboot的启动流程:
1,uboot的第一阶段:BL0,BL1
通过读取 iROM 上的引脚信息,选择时什么样的启动方式(mmc/Flash/eSSD),并搬运BL1的代码到sRam(内部)中运行。
2,uboot的第二阶段:BL2
BL1将BL2的代码搬移到 DDR(外部) 中运行,并通过BL2的代码,搬移内核(操作系统)到空间足够的DDR中运行。
3,uboot的传参:
在完成上述的BL2代码段后,将进入到uboot终端,我们可以使用 printenv 命令来进行开发板环境变量的查看,也可以使用 setenv 在uboot终端可以去设置环境变量,比如设置开发板将要使用的IP地址,网关,子网掩码等等,最关键的通过修改 bootargs 来向即将启动的内核进行参数的传递。
但需要注意的是传递参数时,需要注意以下几点:
1,传递参数的数据结构必须一致。
2,因为在内核启动以后,引导程序将消亡,所以引导程序与内核之间必须约定一个参数存放地址。
3,约定数据格式