U-boot启动流程与加载内核过程
发布时间:2023年12月18日
本篇文章梳理了一下对正点原子的驱动开发教程中u-boot启动流程的梳理,制作了一份流程图,并简单的记录了一下各函数的作用,方便回头翻阅。
一、U-boot启动过程流程图
二、U-boot启动过程函数简单注释
u-boot启动过程中_main函数中调用的各函数作用:
lowlevel_init:设置sp指针指向的地址
board_init_f_alloc_reserve:主要是留出早期的malloc内存区域和gd内存区域
board_init_f_init_reserve:此函数用于初始化gd
board_init_f:此函数主要用来初始化DDR、定时器、完成代码拷贝(把u-boot的代码拷贝到内存最后面)等等
relocate_code:代码重定位函数,此函数负责将uboot拷贝到新的地址去
relocate_vector:重定位向量表
c_runtime_cpu_setup:此函数主要进行两个工作:设置函数board_init_r的两个参数和调用board_init_r函数
board_init_r:完成board_init_f剩余的一些外设初始化工作
main_loop: 就是u-boot开头倒计时用的,如果倒计时结束前按下按键就会进入cli_loop函数
如果按下按键:
? -->cli_loop:主要是调用parse_stream_outer函数
? -->parse_stream_outer:是hush shell的命令解释器,负责接收命令行输入,解析并执行相应的命令。
? -->cmd_process:最终真正执行命令解析和执行相应操作的函数。
如果没有按下按键:
? -->do_bootz:启动内核,主要调用bootz_start和do_bootm_states函数
? -->bootz_start:主要用于初始化结构体变量images的相关成员变量
? -->do_bootm_state:会调用一次do_bootm_states执行BOOTM_STATE_START阶段
? -->bootz_setup:判断当前系统镜像文件是否为Linux镜像
? -->bootm_find_images:查找ramdisk和设备树,不用ramdisk的时候这个函数只用来查找设备树,初始化images下设备树相关的成员变量
? -->do_bootm_states:处理BOOTM_STATE_START、BOOTM_STATE_OS_PREP、BOOTM_STATE_OS_GO三种状态
? -->bootm_start:处理BOOTM_STATE_START状态,清零images
? -->bootm_os_get_boot_func :查找对应系统的启动函数,Linux的启动函数为do_bootm_linux
? 并将该函数赋给函数指针boot_fn
? -->boot_fn:已经变成了do_bootm_linux,处理BOOTM_STATE_OS_PREP、BOOTM_STATE_OS_GO
? 这俩状态
? -->boot_prep_linux:处理BOOTM_STATE_OS_PREP状态,主要用于处理环境变量
? bootargs,bootargs 保存着传递给 Linux kernel 的参数
? -->boot_jump_linux:处理BOOTM_STATE_OS_GO状态,最终执行Linux的kernel_entry函数-->内核启动!!
Tips:
? 1. gd是一个指针,指向一个gd_t类型(定义在include/asm-generic/global_data.h中)的结构体
? 2. images是文件cmd/bootm.c下定义的一个bootm_headers类型的全局变量,里面存放着一些系统镜像、设备树相关的信息。
文章来源:https://blog.csdn.net/xi_xix_i/article/details/134938566
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!