uboot启动第二阶段——start_armboot

本文深入剖析U-Boot启动过程,重点介绍了全局数据结构gd_t的作用及其在启动过程中的应用,包括配置信息的保存、内存布局、初始化序列及各初始化函数的功能。同时,文章还探讨了动态内存区域初始化、环境变量重定向、IP与MAC地址获取等关键步骤。

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

首先看一个gd_t这个结构体,global_data顾名思义就是全局数据,主要保存了uboot的配置信息

bd:板子相关信息    flags:相关标志位    baudrate:串口波特率    have_console:控制台初始化    reloc_off:重定位偏移量    env_addr:环境变量地址    env_valid:环境变量校验成功    fb_base:帧缓冲基地址    jt:一些函数入口

 

 

这是一个非常巧妙的用法,将gd的地址保存在r8寄存器中。这样做的好处是,可以方便地在不同的文件中进行调用,并且经常频繁调用的数据存在寄存器中效率会很高。

 

 

从中我们可以看出uboot的内存排布是下面这样的

 

 

结合start.S和u-boot.lds,可以知道这句代码用于计算镜像大小。

但是分析的时候很容易将C语言调用汇编标志和汇编调用汇编标志搞混,具体分析方法参照我的上一篇博客。

博客链接地址为:https://blog.youkuaiyun.com/lushoumin/article/details/82866957

 

 

很显然在遍历函数指针数组,并调用所有函数,下面看一下init_sequence这个数组内容

很显然是在做一些初始化工作:

cpu_init:什么也没干

board_init:初始化dm9000网卡,初始化机器码和启动参数地址

interrupt_init:初始化定时器4

env_init:初始化环境变量,就是设置默认环境变量

init_baudrate:初始化串口波特率

serial_init:前面已经初始化过串口,这里什么也没干

console_init_f:初始化控制台,就是让控制台标志位置1

display_banner:显示uboot信息

print_cpuinfo:打印时钟信息

checkboard:打印开发板信息

init_func_i2c:初始化i2c

dram_init:初始化DDR信息

display_dram_config:打印DDR信息

 

 

板子上根本没有norflash,所以这些代码没有实际价值

 

 

初始化动态内存区域,其实就是清空堆区

 

 

初始化MMC或者初始化nandflash,取决于配置

 

 

重定向环境变量,即将环境变量从存储介质中重定向到DDR中

 

 

从环境变量中获取IP地址和MAC地址

 

 

初始化设备驱动链表,并且将一些设备加入链表。事实上,这里我们只是将串口设备加入链表

 

 

初始化很多的函数入口地址,事实上整个uboot都没有发现调用这些入口,所以没什么大用,可以不看

 

 

初始化控制台,这里初始化完之后,uboot就可以使用控制台了

 

 

由于没有配置中断,因此这句代码会指向一个空函数

 

 

指向了一个空函数

 

 

网卡相关初始化,事实上板子用的dm9000网卡已经在前面初始化过了,这里其实什么也没干

 

 

这玩意儿是搞LCD的logo用的,不用管它

 

 

这个是更新程序用的,将程序从SD里面烧录的相应介质中

 

 

到这里start_armboot的使命就结束了,下面将跳进main_loop函数中进行命令解析和操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值