0
点赞
收藏
分享

微信扫一扫

嵌入式八股文5

uboot启动流程

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)转到RAM中执行,该工作可使用指令ldr pc来完成

2、Stage2

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

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

(2)初始化Flash设备。

(3)初始化系统内存分配函数。

(4)如果目标系统拥有NAND设备,则初始化NAND设备。

(5)如果目标系统有显示设备,则初始化该类设备。

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MW4Cn5Yr-1669710623169)(C:\Users\61769\AppData\Roaming\Typora\typora-user-images\image-20220216125138086.png)]

uboot启动过程中做了那些事?

1、初始化时钟,关闭看门狗,关中断,启动ICACHE,关闭DCACHE和TLB,关闭MMU,初始化SDRAM,初始化NANDFLASH,重定位。

2、初始化一个串口,检测系统内存映射,将内核映象和根文件系统映象从 Flash上读到SDRAM空间中,为内核设置启动参数,调用内核。

uboot和内核如何完成参数传递?

1、完成相关设置:CPU寄存器设置 R0=0 R1=机器类型ID R2=启动参数标记列表在RAM中起始基地址,设置禁止中断,SVC模式(超级用户模式,有利于硬件初始化)MMU关闭

2、uboot把机器ID通过R1传递给内核,R2存放块内存的基地址,这块内存主要存放uboot给Linux内核的其他参数,参数很多所有需要按规定存放,标记是一种数据结构。

3、标记的数据结构为tag,它由一个tag_header结构和一个联合(union)组成

举报

相关推荐

0 条评论