u-boot

阅读数:9 评论数: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)当前目录是更高优先搜索的地方。