uboot启动流程-涉及board_init_f 函数

一.   uboot启动流程


_main 函数中会调用 board_init_f 函数,本文简单分析一下 board_init_f 函数。

二.   board_init_f 函数

board_init_f 函数主要有两个工作:

(1)   初始化一系列外设,比如串口、定时器,或者打印一些消息等。
(2)   初始化 gd 的各个成员变量,uboot 会将自己重定位到 DRAM 最后面的地址区域,也就
是将自己拷贝到 DRAM 最后面的内存区域中。
这么做的目的是给 Linux 腾出空间,防止 Linux kernel 覆盖掉 uboot ,将 DRAM 前面的区域完整的空出来。
在拷贝之前肯定要给 uboot 各部分 分配好内存位置和大小,比如 gd 应该存放到哪个位置, malloc 内存池应该存放到哪个位置等 等。这些信息都保存在 gd 的成员变量中,因此要对 gd 的这些成员变量做初始化。最终形成一 个完整的内存“分配图”,在后面重定位 uboot 的时候就会用到这个内存“分配图”。

下面简单分析一下 board_init_f 函数。 board_init_f 函数定义在文件 common/board_f.c 中定义,代码如下:
void board_init_f(ulong boot_flags)
{
......
	if (initcall_run_list(init_sequence_f))
		hang();
......
}

重点在第 4 行! 通过 initcall_run_list 函数 来运行初始化序列 init_sequence_f 里面的一些
列函数,init_sequence_f 里面包含了一系列的初始化函数。 
init_sequence_f 也是定义在文件 common/board_f.c 中,由于 init_sequence_f 的内容比较长,里面有大量的条件编译代码,这里 为了缩小篇幅,将条件编译部分删除掉了
去掉条件编译以后的 init_sequence_f 函数 前半部分代码 如下:
(因为 init_sequence_f 函数后半部分是内存分配,下一篇文章再分析)
static 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值