《Linux内核深度解析》第一章 内核引导和初始化学习
[复制链接]
首先来看下UBOOT源码结构图,如下所示,网络上下载的,还是看的比较清晰的,学习第一章,目前我还是用我之前用过的NXP 的IMX6ULL来作为例程来学习
Uboot是德国DDENX软件工程中心开发的引导程序
以IMX6UL为例,第一阶段对应的文件时arch/arm/cpu/armv7/start.S和arch/arm/cpu/armv7/lowlevel_init.S
u-boot启动第一阶段流程图如下所示:
从标号reset开始的代码如下:
第73行代码,主处理器执行函数main
其实整个启动s文件和STM32的S文件还是有些许相似的
Lowlevel_init.s如下图所示
在arch/arm/lib/crt0.S文件中的_main函数中会调用若干个C函数
board_init_f_alloc_reserve,用于设置内部IRAM
board_init_f_init_reserve,将上述函数划分的存储空间进行清零,把早期malloc区的地址写入到global_data结构体变量的malloc_base成员中去。
再调用board_init_f函数
board_init_f函数定义在文件common/board_f.c中
relocate_code重定向技术,可以说也算是Uboot的一个重点了,也就是将uboot自身镜像拷贝到ddr上的另外一个位置的动作。
函数最终调用run_main_loop进入主循环,并陷入死循环,不再返回。
cli_init:用于初始化hash shell的一些变量
run_preboot_environment_command:执行预定义的环境变量的命令
bootdelay_process:加载延时处理,一般用于Uboot启动后,有几秒的倒计时,用于进入命令行模式。
cli_loop:命令行模式,主要作用于Uboot的命令行交互。
|