u-boot
阅读数:138 评论数:0
跳转到新版页面分类
硬件/嵌入式
正文
一、概念
1、u-boot本质上就是一个单片机程序,所以对应不同的硬件设计和cpu,u-boot必须按需修改。
2、u-boot用来引导启动操作系统。
3、文档地址:https://u-boot.readthedocs.io/en/latest/build/source.html
4、源码地址:https://github.com/u-boot/u-boot
5、u-boot是个庞大的单片机工程,作用就是加载linux
6、u-boot一般从flash或sd读出内核可执行程序放到sram里,然后执行内核。
7、必需具备的基本功能:
(1)读写flash或sd卡
(2)写sdram
(3)从sdram中启动内核
(4)初始化时钟
(5)初始化串甚至网口
二、u-boot的结构与启动过程
u-boot启动过程可以分为单阶段与多阶段两种:通常,多阶段的u-boot可以提供更加复杂的功能和更好的可移值性。从固态存储器设备上启动的bootloader大多都是两阶段的启动过程:第一阶段使用汇编来实现,它完成一些依赖于CPU体系结构的初始化(就是xxx.S文件),并调用第二阶段的代码,第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,而且代码会有更好的可读性和可移值性。
1、第一阶段(xxx.S文件)
(1)硬件设备初始化
(2)为加载第二阶段代码准备ram空间
(3)复制第二阶段代码到ram空间中
(4)设置好代码运行的堆栈空间
(5)跳转到第二阶段代码的C入口点
2、第二阶段
(1)配置关闭看门狗、关闭各类中断、设置CPU的速度和初始化系统时钟
(2)初始化本阶段要使用到的硬件设备
(3)检测系统内存映射,就是确定板上使用了多少内存,它们的地址空间是多少。
(4)将内核镜像和根文件系统镜像从flash读到ram空间中去运行
(5)为内核设置启动参数
(6)调用并运行内核
三、调用内核之前 ,需要的条件
1、CPU寄存器的设置
(1)R0=0
(2)R1=机器类型ID
(3)R2=启动参数标记列表在RAM起始基地址
2、CPU工作模式
(1)必须禁止中断
(2)CPU必须为SVC模式(SVC:管理员模式,CPU有权访问一些受保护的寄存器)
3、Cache和MMu的设置(高速缓存寄存器和内存管理单元)
(1)MMU必须关闭
(2)指令Cache可以打开也可以关闭
(3)数据Cache必须关闭。
四、Bootloader与内核的数据交互
bootloader与内核的交互是单向的,bootloader将各类参数传递给内核。由于它们不能同时运行,传递参数的方法是:bootloader将参数放在某个约定的地方之后,再启动内核,内核启动后从这个地方获取参数。
参数以规定的结构,即标记列表(tagged list)形式来传递,标记列表以ATAG_CORE开始,以标记ATAG_NONE结束。
五、u-boot编译步骤
1、获取u-boot源代码,配置好CROSS_COMPILE和ARCH
2、make xxx_defconfig
xxx_defconfig是其他人已经编写好的配置文件,用于在编译u-boot之前配置u-boot。
3、make
六、u-boot的Makefile中用的一些语法
1、target
targets : [ prerequisites ] [; command]
[command1]
[command2]
[……]
(1)意思:如果targets不存在,或者targets存在但prerequisites有更新,则执行command命令。
(2)targets代表目标名,也就是当前目录下某个文件的名称。
(3)prerequisites,代表该targets的依赖关系。
(4)command需以;分隔,如果另起一行,则前面必须是tab,Makefile中用tab标识一个command.
(5)例子,假如当前目录下有个main.c文件,要将其编译成main.o,则Makefile可以这样写:
main.o : main.c
gcc -c main.c
2、PHONY target
不作创建目标文件的target就叫伪目标,伪目标的主要用途就是用于那些需要无条件执行的target,例如clean,用于清除编译生成的临时文件。
.PHONY: all
all :
@echo this is all
(1)不管当前目录下是否有all这个目标文件,都会执行。
(2)伪目标后面也可以定义依赖关系。
(3)command前加@,代表不显示命令本身,只显示命令的结果。
(4)如果伪目标是Makefile的第一个目标,也会被做为默认目标。
3、VPATH
如果定义了这个变量,那么make就会在当前目标找不到的依赖文件和目标文件时,到所指定的目录中寻找。
VPATH = src:../headers
(1)目录由冒号分隔。
(2)当前目录是更高优先搜索的地方。