003-BSP学习笔记-Uboot启动流程(非细节)

一、u-boot.lds

入口

ENTRY(_start)

_start在arch/arm/lib/vectors.S中定义

 *(.__image_copy_start)

搜索__image_copy_start
grep -nR "__image_copy_start"
在u-boot.map中找到.text的地址是0x87800000

 *(.vectors) #在vectors.S为向量表
 arch/arm/cpu/armv7/start.o (.text*) #arch/arm/cpu/armv7/start.s 编译出来的代码放到中断向量表后面
  *(.text*) #其他代码存放位置处(即uboot.bin的位置)

二、_start

1、reset初始化cpu工作模式、向量表、调用cpu_init_crit转到lowlevel_init
2、lowlevel_init在`arch/arm/cpu/armv7/lowlevel_init.S``中定义,转s_init
3、s_init检查新品啊类型,IMX6UL啥也不做,返回到save_boot_params_ret,如图:
在这里插入图片描述
4、 _main,调用了 board_init_f、 relocate_code、relocate_vectors 和 board_init_r 这 4 个函数。
5、board_init_f
①初始化一系列外设,比如串口、定时器,或者打印一些消息等。
②初始化 gd 的各个成员变量, uboot 会将自己重定位到 DRAM 最后面的地址区域,也就是将自己拷贝到 DRAM 最后面的内存区域中。这么做的目的是给 Linux 腾出空间,防止 Linuxkernel 覆盖掉 uboot,将 DRAM 前面的区域完整的空出来。最终内存分配如下:
在这里插入图片描述
6、relocate_code用于代码拷贝
7、relocate_vectors 用于重定位向量表
8、board_init_r。board_init_f 并没有初始化所有的外设,还需要做一些后续工作,这些后续工作就是由函数 board_init_r 完成。包括stdio, 串口,I2C,USB,EMMC/NAND、LCD、CPU核、网络等。
9、run_main_loop。UBOOT启动倒计时,等待按下回车键进入uboot命令行,或启动kernel。
10、cli_loop。uboot命令行处理。
11、cmd_process。uboot命令执行

三、bootz启动Linux内核过程

1、在文件 cmd/bootm.c定义的bootm_headers_t images全局变量
2、bootz_start,设置镜像入口DRAM点。调用bootz_setup ,并查找设备树、ramdisk。images->ep=0X80800000
3、bootz_setup 在指定地址读取iamge head魔数。
4、bootm_find_images,查找设备树。 images.ft_addr=0X83000000
5、do_bootm_states 根据状态处理OS启动
6、bootm_os_get_boot_func,查找对应的系统启动函数
7、do_bootm_linux 启动linux内核,调用 kernel_entry,
8、kernel_entry,三个参数: zero, arch, params,第一个参数 zero 同样为 0;第二个参数为机器 ID; 第三个参数 ATAGS 或者设备树(DTB)首地址,ATAGS 是传统的方法,用于传递一些命令行信息
9、announce_and_cleanup打印信息,清理资源
执行过程如图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值