U-Boot启动流程分析
2021-11-14 03:34:37 0 举报
U-Boot启动流程分析
作者其他创作
大纲/内容
arch_cpu_init_dm 函数未实现
U-Boot启动流程分析版本:U-Boot 2016.03ARCH:ARMCPU:ARMV7VENDOR : freescale<芯片厂家 :飞思卡尔>SOC:mx6uBOARD:mx6ullevk
board_init_f_alloc_reserve<common/init/board_init.c>主要是留出早期的 malloc 内存区域和 gd 内存区域
U-Boot移植分析:## U-Boot 移植\t\tARCH = arm\t\tCPU = armv7\t\tBOARD = mx6ullevk\t\tVENDOR = freescale\t\tSOC = mx60. 准备阶段:<开发板运行 U-Boot 需要 DDR 或者DRAM,串口(打印调试信息)、SD、EMMC/NAND> [基本同官方一样]\t0.0 获取芯片厂商官方U-Boot\t\thttps://www.nxp.com/products/processors-and-microcontrollers/arm-processors/i-mx-applications-processors/i-mx-6-processors/i-mx-6ull-single-core-processor-with-arm-cortex-a7-core:i.MX6ULL\t0.1 下载 uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2\t0.2 解压 \t\t# tar -xvf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2\t0.3 重命名需要移植开发板名称<可选>\t\t# mv uboot-imx-rel_imx_4.1.15_2.1.0_ga uboot-imx-rel_imx_4.1.15_2.1.0_<Board_name>\t0.4 编译\t\t# 清空工程\t\tmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean\t\t# 配置编译选项\t\tmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig\t\t#编译\t\tmake V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12\t0.5 创建 Vscode 工作空间 <屏蔽无关文件>1. 添加板子默认配置文件\t1.1 借鉴NXP官方配置文件6ull_evk 开发板 默认配置文件也是使用原厂配置进行修改;\t\t# cd configs/\t\t# cp mx6ull_14x14_evk_emmc_defconfig mx6ull_huin_emmc_defconfig\t\t[修改内容如下]\t\tCONFIG_SYS_EXTRA_OPTIONS=\
将旧lr(传入ip)和当前lr保存到堆栈
boot_fn()实际运行函数do_bootm_linux()
cli_process_fdt定义了 CONFIG_OF_CONTROL 的话函数 cli_process_fdt 就会实现未使用
cli_simple_loop未使用
函数入口
initcall_run_list(init_sequence_f)初始化序列函数调用
cpu_init_crit
reset<arch/arm/cpu/armv7/start.S>
initcall_run_list(init_sequence_r)初始化序列函数调用
bootm_os_get_boot_func()获取Linux系统启动函数:do_bootm_linux()
bootz命令启动Linux内核过程
announce_and_cleanup()输出 Starting kernel ...并且做一些清理工作
cmd_process<common/command.c>
获取
cpu_init_cp15<初始化 CP15寄存器>
_main<arch/arm/lib/crt0.S>
mark_bootstage引导阶段标记名称
board_init_f_init_reserve<common/init/board_init.c>重要结构体:global_data初始化 gd->malloc_base = base;
board_postclk_init<arch/arm/cpu/armv7/mx6/soc.c>对于 I.MX6ULL 来说是设置 VDDSOC 电压
board_init_r<common/board_r.c>函数来初始化一些外设和 gd 的成员变量
arch_cpu_init<arch/arm/cpu/armv7/mx6/soc.c>基本的与cpu相关的设置
设置一个临时堆栈。全球数据尚不可用
save_boot_params<arch/arm/cpu/armv7/start.S>
board_init_f<common/board_f.c>1、初始化一系列外设.2、初始化 gd 的各个成员变量.设置初始C运行时环境并调用board_init_f(0)
禁用MMU和caches(缓存)
initf_dm<common/board_f.c>驱动模型的一些初始化
relocate_code <arch/arm/lib/relocate.S>重定位就是 uboot 将自身拷贝到 DRAM 的另一个地放去继续运行(DRAM 的高地址处)
bootstage_mark_name打印出启动进度引导阶段\\标记\\名称
初始化内存分配图
gd->flags = boot_flags;\tgd->have_console = 0;
run_pipe_rea run_pipe_real
initf_malloc<common/dlmalloc.c>初始化 gd 中跟 malloc 有关的成员变量[gd->malloc_limit内存池大小]
setenv定义了宏 CONFIG_VERSION_VARIABLE 的话就会执行函数 setenv设置版本号环境变量
镜像描述
u-boot.lds
boot_selected_os()启动所选操作系统
变量 数值 描述_image_copy_start 0x87800000 uboot 拷贝的首地址_image_copy_end 0x8785dd54 uboot 拷贝的结束地址__rel_dyn_start 0x8785dd54 .rel.dyn 段起始地址__rel_dyn_end 0x878668f4 .rel.dyn 段结束地址_image_binary_end 0x878668f4 镜像结束地址__bss_start 0x8785dd54 .bss 段起始地址__bss_end 0x878a8e74 .bss 段结束地址变量”值可以在 u-boot.map 文件中查找
设置全局数据
u-boot启动
do-while 循环就是处理输入命令的
jump_to_copy<common/board_f.c>代码拷贝
Invalidate L1 I/D使L1 I/D失效
调用函数 parse_stream 进行命令解析
parse_file_outer解析指令并执行<common/cli_hush.c>
ulong bootm_disable_interrupts(void)<common/bootm.c>关闭中断
boot_jump_linux()引导跳转linux
VBAR 寄存器 = uboot 的入口地址向量表重定位
kernel_entry() 启动Linux内核!!!
BOOT状态:BOOTM_STATE_OS_PREP <跳转到操作系统的前的准备动作>BOOTM_STATE_OS_FAKE_GO<伪跳转,一般都能直接跳转到kernel中去>BOOTM_STATE_OS_GO<跳转到kernel中去>
cli_secure_boot_cmd未使用
save_boot_params_ret<arch/arm/cpu/armv7/start.S>
autoboot_command此函数就是检查倒计时是否结束
调用函数 cmd_call 来执行具体的命令
setup_file_in_str(&input)<common/cli_hush.c>初始化变量 input 的成员变量
_start<arch/arm/lib/vectors.S>
调用调用 run_list 函数来执行解析出来的命令
initf_console_record<common/board_f.c>初始化控制台记录[未定义]
font color=\"#ff0000\
lowlevel_init<arch/arm/cpu/armv7/lowlevel_init.S>
relocate_vectors<arch/arm/lib/relocate.S>重定位向量表
s_init<arch/arm/cpu/armv7/mx6/soc.c>空函数
SP指针->CONFIG_SYS_INIT_SP_ADDR=0x0091FF00
函数 find_cmd 在命令表中找到指定的命令;
收藏
收藏
0 条评论
下一页
为你推荐
查看更多