七.linux开发之uboot移植(七)——uboot源码分析2-启动第二阶段之start_armboot函数分析1

本文详细分析了uboot启动的第二阶段,从start_armboot函数入手,涵盖DECLARE_GLOBAL_DATA_PTR宏定义、内存分布、board_init函数、interrupt_init和env_init等功能解析,揭示了uboot在启动过程中对硬件、内存、串口、环境变量等的初始化过程,以及在实际操作中遇到的问题与解决方案。

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

需要详细了解的该节有道云笔记地址:
http://note.youdao.com/noteshare?id=7122149d919373403a51d2828b2da754&sub=59FC27D5573D451BB55C01E645E65E58

一.uboot启动第二阶段之start_armboot函数简介

1.start_armboot函数简介

clipboard.png

(1)这个函数在uboot/lib_arm/board.c的第444行开始到908行结束。

(2)、即一个函数组成uboot第二阶段

2、宏观分析:uboot第二阶段应该做什么

(1)概括来讲uboot第一阶段主要就是初始化了SoC内部的一些部件(譬如看门狗、时钟),然后初始化DDR并且完成重定位。

(2)由宏观分析来讲,uboot的第二阶段就是要初始化剩下的还没被初始化的硬件。主要是SoC外部硬件(譬如iNand、网卡芯片····)、uboot本身的一些东西(uboot的命令、环境变量等····)。然后最终初始化完必要的东西后进入uboot的命令行准备接受命令。

3.、思考:uboot第二阶段完结于何处?(回忆uboot初体验章节)

(1)uboot启动后自动运行打印出很多信息(这些信息就是uboot在第一和第二阶段不断进行初始化时,打印出来的信息)。然后uboot进入了倒数bootdelay秒然后执行bootcmd对应的启动命令。

(2)如果用户没有干涉则会执行bootcmd进入自动启动内核流程(uboot就死掉了);此时用户可以按下回车键打断uboot的自动启动进入uboot的命令行下。然后uboot就一直工作在命令行下。

(3)uboot的命令行就是一个死循环,循环体内不断重复:接收命令、解析命令、执行命令。这就是uboot最终的归宿。

clipboard.png

二.uboot启动第二阶段之start_armboot函数解析1

clipboard.png

clipboard.png

1.DECLARE_GLOBAL_DATA_PTR宏定义

(1)#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm (“r8”)

定义了一个全局变量名字叫gd,这个全局变量是一个指针类型,占4字节。用volatile修饰表示可变的,用register修饰表示这个变量要尽量放到寄存器中,后面的asm(“r8”)是gcc支持的一种语法,意思就是要把gd放到寄存器r8中。

(2)综合分析,DECLARE_GLOBAL_DATA_PTR就是定义了一个要放在寄存器r8中的全局变量,名字叫gd,类型是一个指向gd_t类型变量的指针。

(3)为什么要定义为register?

因为这个全局变量gd(global
data的简称)是uboot中很重要的一个全局变量(准确的说这个全局变量是一个结构体,里面有很多内容,这些内容加起来构成的结构体就是uboot中常用的所有的全局变量),这个gd在程序中经常被访问,因此放在register中提升效率。因此纯粹是运行效率方面考虑,和功能要求无关。并不是必须的。

(4)gd_t定义在include/asm-arm/global_data.h中。

gd_t中定义了很多全局变量,都是整个uboot使用的;其中有一个bd_t类型的指针,指向一个bd_t类型的变量,这个bd是开发板的板级信息的结构体,里面有不少硬件。

clipboard.png

clipboard.png

三.uboot启动第二阶段之start_armboot函数解析内存分布

1、为什么要分配内存

(1)DECLARE_GLOBAL_DATA_PTR只是定义了一个指针,也就是说gd里的这些全局变量并没有被分配内存,我们在使用gd之前要给他分配内存,否则gd也只是一个野指针而已。

(2)gd和bd需要内存,内存当前没有被人管理(因为没有操作系统统一管理内存),大片的DDR内存散放着可以随意使用(只要使用内存地址直接去访问内存即可)。但是因为uboot中后续很多操作还需要大片的连着内存块,因此这里使用内存要本着够用就好,紧凑排布的原则。所以我们在uboot中需要有一个整体规划。

下面分析这块内存分布

clipboard.png

(3)上图最后的内存间隔(c语言中嵌套汇编的用法),作用是为了防止高版本的gcc的优化造成错误。

2、内存排布

(1)uboot区
CFG_UBOOT_BASE-xx(CFG_UBOOT_SIZE为2M,长度为uboot的实际长度),如果移植内存不够时,可改此处分配内存大小

clipboard.png

(2)堆区 长度为CFG_MALLOC_LEN,实际为912KB

(3)栈区 长度为CFG_STACK_SIZE,实际为512KB

clipboard.png

(4)gd 长度为sizeof(gd_t),实际36字节

clipboard.png

(5)bd 长度为sizeof(bd_t),实际为44字节左右

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值