uboot基础知识一
1、uboot启动的第一阶段----汇编代码start.S
大部分都是Soc内部的初始化,可以理解成一些通用的初始化,只要使用该款Soc,第一阶段的初始化流程基本是一样的。不直接用C语言进行初始化是因为,C语言运行需要一定的环境,比如栈的设置,而汇编代码刚好可以为C语言的运行初始化环境。在汇编代码的结束阶段就是跳转到C语言实现的函数继续进行初始化。
2、计算机的主要部件是CPU+Flash/硬盘 + 内部存储器DDR。
3、main_loop函数是u-boot最重要的功能实现---引导内核、功能交互,main_loop可以理解为u-boot的shell,通过该函数,程序员可以与u-boot进行交互,当然如果程序员无任何动作(串口无字符串输入),u-boot会自动的去做它最重要的工作---引导内核kernel。
4、uboot必须进行和硬件相对应的代码级别的更改和移植
arch:文件和CPU架构相关的源代码
board:与开发板相关的源代码
make
5、uboot中事先给linux内核准备一些启动参数,放在内存中特定位置然后传给内核,内核启动后会到这个特定位置去取这些参数,然后在内核中解析这些参数,这些参数将被用来指导linux内核的启动过程。uboot到内核的参数传递几种办法
① 通过tag(bootargs)的方式传递:kernel_entry(r1,r2,r3)。r0=0,r1=machid,r2=启动参数
②uboot跳转内核的传参:theKernel(0, 362, 0x30000100)
r0 一般设置为0;
r1 一般设置为machine id (在使用设备树时该参数没有被使用);
r2 一般设置ATAGS或DTB的开始地址
最初在r2的位置,存放了uboot准备好的tags,传递给内核,当使用设备树时,r2不再存放tag首地址,而是uboot将设备树加载到内存中的地址
③将硬件配置和系统运行参数组成设备树文件,通过dts编译dtb,在系统启动过程中:
a:将dtb加载到内存,tftp 0x8000 zlmage ,tftpboot 0x100 test-ek.dtb将kernel和dtb下载到flash中,fdt addr 0x100将dtb载入内存,最终通过bootz 0x8000 – 0x100启动系统。
b:将dts和kernel打包成pImage,这种需要uboot实现读plmage头,uboot从plmage的头部去读取dtb的地址,然后传递给kernel
c:启动kernel选择“ARM_APPENDED_DTB”将dtb和kernel打包在一起,在kernel启动时会去紧挨的地方去寻找dtb,这样不需要uboot来传递dtb地址了。
6、uboot的环境变量
default_environment是字符数组,是一个全局变量,是默认的环境变量参数。在uboot启动的第二阶段系统会判断env分区的crc是否通过。如果正常的存储环境变量,则读取环境变量来覆盖default_environment字符数组。
7、uboot的作用:
①启动操作系统内核
②负责部署整个计算机系统
③操作Flash等板子上的硬盘的驱动
④提供人机交互命令行
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
