uboot启动第二阶段分析

本文详细剖析了UBoot启动的第二阶段,包括内存排布、部分外设初始化、环境变量重定位、控制台和网卡初始化、开机logo显示以及通过SD卡烧录系统的过程。通过对start_armboot函数的分析,揭示了UBoot如何一步步完成系统启动前的准备工作。

之前介绍了 uboot 启动第一阶段,现在介绍启动的第二阶段

启动阶段的工作

启动第一阶段的主要工作是对处理器的内部资源(如时钟、串口)、内存(ddr)初始化,并进行 uboot 的重定位,并跳转到启动第二阶段

启动第二阶段的主要工作则是对处理器的外部资源(iNand、网卡芯片…)、uboot环境(uboot命令、环境变量…)等初始化,并等待命令输入

工作流程

正常情况下,在 uboot 的初始化工作完毕后,会启动内核,在启动内核后结束 uboot 程序。

但是用户可以阻止 uboot 的结束,进入 uboot 的命令行模式,就是一个 uboot 中的死循环;uboot 在死循环中不断接受命令、解析命令、执行命令

start_armboot

如果说启动第一阶段主要工作是 lowlevel_init 完成的,那么启动第二阶段的主要工作是 start_armboot 完成的

相关变量介绍

init_fnc_ptr

它是一个 init_fnc_t 类型的函数指针数组,通过 typedef int (init_fnc_t) (void); 定义

gd

#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")

gd 这个变量通过 DECLARE_GLOBAL_DATA_PTR 定义,这个变量的作用是用来存储 uboot 需要使用到的全局变量,这样可以减少全局变量的数量,方便他人阅读代码。具体的作用可以从结构体成员中得知

typedef	struct	global_data {
   
   
	bd_t		*bd;
	unsigned long	flags;
	unsigned long	baudrate;
	unsigned long	have_console;	/* serial_init() was called */
	unsigned long	reloc_off;	/* Relocation Offset */
	unsigned long	env_addr;	/* Address  of Environment struct */
	unsigned long	env_valid;	/* Checksum of Environment valid? */
	unsigned long	fb_base;	/* base address of frame buffer */
#ifdef CONFIG_VFD
	unsigned char	vfd_type;	/* display type */
#endif
	void		**jt;		/* jump table */
} gd_t;

gd 变量的结构体成员的功能基本可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值