U-Boot 启动流程详解

本文详细分析了U-Boot的启动流程,包括入口点、链接脚本的作用、中断向量表的结构,以及reset和save_boot_params函数在启动过程中的关键作用,帮助读者理解Linux内核如何被加载到内存中。
摘要由CSDN通过智能技术生成
我们详细的分析了 uboot 的顶层 Makefile ,理清了 uboot 的编译流程。本章我们来详细的分析一下 uboot 的启动流程,理清 uboot 是如何启动的。通过对 uboot 启动流程的梳理,我们就可以掌握一些外设是在哪里被初始化的,这样当我们需要修改这些外设驱动的时候就会心里有数。另外,通过分析 uboot 的启动流程可以了解 Linux 内核是如何被启动的。
链接脚本 u-boot.lds 详解
要分析 uboot 的启动流程,首先要找到“入口”,找到第一行程序在哪里。程序的链接是由链接脚本来决定的,所以通过链接脚本可以找到程序的入口。如果没有编译过 uboot 的话链接脚本为arch/arm/cpu/u-boot.lds 。但是这个不是最终使用的链接脚本,最终的链接脚本是在这个链接脚本的基础上生成的。编译一下 uboot ,编译完成以后就会在 uboot 根目录下生成 u-boot.lds文件,如图所示:
打开u-boot.lds文件如下所示
3 行为代码当前入口点: _start _start 在文件 arch/arm/lib/vectors.S 中有定义。
从图 32.1.2 中的代码可以看出, _start 后面就是中断向量表,从图中的“ .section ".vectors",
"ax ”可以得到,此代码存放在 .vectors 段里面。
使用如下命令在 uboot 中查找“ __image_copy_start ”:
grep -nR "__image_copy_start"
u-boot.map uboot 的映射文件,可以从此文件看到某个文件或者函数链接到了哪个地址,
从图 32.1.4 932 行可以看到 __image_copy_start 0X87800000 ,而 .text 的起始地址也是
0X87800000
继续回到示例代码 32.1.1 中,第 11 行是 vectors 段, vectors 段保存中断向量表,从图 32.1.2 中我们知道了 vectors.S 的代码是存在 vectors 段中的。从图 32.1.4 可以看出, vectors 段的起始地址也是 0X87800000 ,说明整个 uboot 的起始地址就是 0X87800000 ,这也是为什么我们裸机例程的链接起始地址选择 0X87800000 了,目的就是为了和 uboot 一致
12 行将 arch/arm/cpu/armv7/start.s 编译出来的代码放到中断向量表后面。
13 行为 text 段,其他的代码段就放到这里
u-boot.lds 中有一些跟地址有关的“变量”需要我们注意一下,后面分析 u-boot 源码的
时候会用到,这些变量要最终编译完成才能确定的!!!比如我编译完成以后这些“变量”的值
如表 32.1.1 所示:
32.1.1 中的“变量”值可以在 u-boot.map 文件中查找,表 32.1.1 中除了 __image_copy_start
以外,其他的变量值每次编译的时候可能会变化,如果修改了 uboot 代码、修改了 uboot 配置、
选用不同的优化等级等等都会影响到这些值。所以,一切以实际值为准!
U-Boot 启动流程详解
reset 函数源码详解
u-boot.lds 中我们已经知道了入口点是 arch/arm/lib/vectors.S 文件中的 _start ,代码如下
48 _start 开始的是中断向量表,其中 54~61 行就是中断向量表,和我们裸机例程里面一样。
54 行跳转到 reset 函数里面, reset 函数在 arch/arm/cpu/armv7/start.S 里面,代码如下:
35 行就是 reset 函数。
37 行从 reset 函数跳转到了 save_boot_params 函数,而 save_boot_params 函数同样定义
start.S 里面,定义如下:
save_boot_params 函数也是只有一句跳转语句,跳转到 save_boot_params_ret 函数,
save_boot_params_ret 函数代码如下:
43 行,读取寄存器 cpsr 中的值,并保存到 r0 寄存器中。
44 行,将寄存器 r0 中的值与 0X1F 进行与运算,结果保存到 r1 寄存器中,目的就是提
cpsr bit0~bit4 5 位,这 5 位为 M4 M3 M2 M1 M0 M[4:0] 这五位用来设置处理器的工作
模式,如表 32.2.1.1 所示:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值