一. 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

最低0.47元/天 解锁文章
1734

被折叠的 条评论
为什么被折叠?



