Uboot的作用以及启动内核的过程

1. Bootloader简介

系统上电后,需要一段程序来进行初始化:关闭看门狗,改变系统时钟,初始化存储控制器,将更多的代码复制到内存中等。它就是bootloader。

bootloader的实现非常依赖具体硬件,在嵌入式系统中,硬件配置千差万别,即使是相同的CPU,它的外设(比如flash)也可能不同,所以不可能有一个bootloader支持所有的CPU,所有的电路板。即使是支持CPU架构比较多的UBoot,也不是一拿来就可以使用(除非里面的配置刚好和你的板子相同)。需要进行一些配置。

CPU上电后,会从某个地址开始执行,比如MIPS结构的CPU会从0xBFC00000取第一条指令,而ARM结构的CPU则会从0x00000000开始,嵌入式开发板中,需要把存储器件的ROM或Flash等映射到这个地址,Bootloader就存放在这个地址的开始处,一上电就开始执行。(手机中的RAM和ROM分别对应电脑的内存和硬盘)

2. 启动流程。

u-boot系统启动流程 大多数bootloader都分为stage1和stage2两部分,u-boot也不例外。

依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

1.Stage1 start.S代码结构 u-boot的stage1代码通常放在start.S文件中,他用汇编语言写成,其主要代码部分如下

(1) 定义入口。: 该工作通过修改连接器脚本来完成。

(2)设置异常向量(Exception Vector)。

(3)设置CPU的速度、时钟频率及终端控制寄存器。

(4)初始化内存控制器。

(5)将ROM中的程序复制到RAM中。

(6) 关中断,关看门狗

(7)初始化堆栈,清bss段,为第二阶段准备。

(8)转到RAM中执行,该工作可使用指令ldr pc来完成。

2、Stage2

C语言代码部分 lib_arm/board.c中的start arm boot是C语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数只要完成如下操作:

(1)调用一系列的初始化函数。

(2)初始化存储设备

(3)初始化简单硬件如串口,lcd等

(4)初始化相关网络设备,填写IP、MAC地址等。

(5)进去命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

在这里插入图片描述

发布了137 篇原创文章 · 获赞 44 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_38769551/article/details/105143583