uboot启动流程概述_u-boot启动流程分析(1)_平台相关部分

本文分析u-boot的平台相关启动流程,包括board、machine、arch、cpu的初始化,重点介绍_start、reset及_main函数。文章介绍了u-boot的多平台架构,以及在ARM64上的启动步骤,涉及配置项如CONFIG_SYS_RESET_SCTRL、CONFIG_ARM_ERRATA_XXX等,并对SPL功能进行了简单说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

u-boot启动流程分析(1)_平台相关部分

作者:wowo 发布于:2016-5-19 22:38

分类:u-boot分析

1. 前言

本文将结合u-boot的“board—>machine—>arch—>cpu”框架,介绍u-boot中平台相关部分的启动流程。并通过对启动流程的简单分析,掌握u-boot移植的基本方法。

注1:本文所使用的u-boot版本,是2016/4/23从u-boot官网(git://git.denx.de/u-boot.git)导入的一个快照,具体可参考“https://github.com/wowotechX/u-boot”。

注2:为了方便,本文将“平台相关部分的启动流程”,定义为从u-boot启动开始,到board有关的C代码被执行为止。后续的部分,会在下一篇文章中分析。

2. 多平台架构

嵌入式软件工程师,在设计某一个软件的时候,或多或少的都会思考“跨平台”的问题(驱动和系统工程师尤甚): 这个“软件”是否可以运行于不同的软硬件环境中?

这个“软件”和其它“软件”是否有共同的地方可以抽象出来?

这些问题的本质,是软件工程中的抽象和封装,以最简洁、最高效的方式,实现尽可能多的功能。u-boot作为一个跨平台、跨设备的bootloader,同样会面临这些问题。它的解决方案,就是“board—>machine—>arch—>cpu”框架,如下:

图片1 u-boot多平台架构

该结构其实就是device tree普及之前,linux kernel所采用的结构,它基本上和硬件的拓扑结构保持一致: 一个嵌入式产品,无论是一款手机,还是一块开发板,首先呈现给用户的就是一个可满足产品功能的“硬件实体”,该“实体”包括一些必要的外部设备,如显示屏、按键、麦克风、扬声器等等,它就是图片1中最大的那个方块----board;

除了用户能感知到的外部设备,board上还有一个最重要设备----CPU,是产品的运算和控制中心。不过,众所周知,当今的CPU非常不单纯,它在一个芯片上,尽可能多的集成了和外部设备有关的功能,例如各种各样的设备控制器。这就是传说中的SOC,对应图片1中的“machine”;

SOC里面,涉及到ARCH和CPU的概念,需要注意的是,u-boot的抽象,和ARM等标准抽象(可参考“ARM概念梳理:Architecture, Core, CPU,SOC”中的描述)不一致。如图片1所示,u-boot把arm(包括arm32和arm64)归为一个ARCH大类,而把armv8等抽象为CPU。有点奇葩,大家记着就是了。

基于图片1的架构,u-boot和平台有关的初始化流程,显得比较直观、清晰: 1)u-boot启动后,会先执行CPU(如armv8)的初始化代码。

2)CPU相关的代码,会调用ARCH的公共代码(如arch/arm)。

3)ARCH的公共代码,在适当的时候,调用board有关的接口。u-boot的功能逻辑,大多是由common代码实现,部分和平台有关的部分,则由公共代码声明,由board代码实现。

4)board代码在需要的时候,会调用machine(arch/arm/mach-xxx)提供的接口,实现特定的功能。因此machine的定位是提供一些基础的代码支持,不会直接参与到u-boot的功能逻辑中。

具体请参考后面的分析。

3. 平台相关部分的启动流程分析

本文先不涉及u-boot和平台相关的Kconfig/Makefile部分,以ARM64为例,假定u-boot首先从“arch/arm/cpu/armv8/start.S”的_start接口开始执行。因此我们从_start开始分析。

注3:后续u-boot的移植指南中,会介绍该假定的依据。

注4:启动流程分析的过程中,我们会重点解释、归纳出代码中以CONFIG_为前缀的配置项,后续u-boot的移植工作,大部分就是这些配置项的确定过程。

3.1 _start

_start是u-boot启动后的第一个执行地址,对armv8来说,它只是简单的跳转到reset处执行,如下:

3.2 reset

reset的代码如下:

/* https://github.com/wowotechX/u-boot/blob/x_integration/arch/arm/cpu/armv8/start.S */

reset:

#ifdef CONFIG_SYS_RESET_SCTRL

bl reset_sctrl

#endif

/*

* Could be EL3/EL2/EL1, Initial State:

* Little Endian, MMU Disabled, i/dCache Disabled

*/

adrx0, vectors

switch_el x1, 3f, 2f, 1f

3:msrvbar_el3, x0

mrsx0, scr_el3

orrx0, x0, #0xf/* SCR_EL3.NS|IRQ|FIQ|EA */

msrscr_el3, x0

msrcptr_el3, xzr/* Enable FP/SIMD */

#ifdef COUNTER_FREQUENCY

ldrx0, =COUNTER_FREQUENCY

msrcntfrq_el0, x0/* Initialize CNTFRQ */

#endif

b0f

2:msrvb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值