1、u-boot入口:入口即第一行程序,程序的链接是由链接脚本决定的,编译uboot之后,可以在根目录下生成u-boot.lds文件
打开lds文件可以看到代码当前入口点: :_start,_start后面就是中断向量表,通过查看map地址可以得知start地址为 0Xc0100000,即整个 uboot的起始地址就是 0Xc0100000
2、u-boot启动过程中主要用到的一些函数:
board_init_f:初始化一系列外设,比如串口、定时器,或者打印一些消息等。
relocate_code:用于代码拷贝
relocate_vectors:重定位向量表
board_init_f:初始化外设的后续工作
run_main_loop:uboot启动以后会进入 N(N=1.2.3…)秒倒计时,如果在 N秒倒计时结束之前按下回车键,那么就会进入 uboot的命令模式,如果倒计时结束以后都没有按下回车键,那么就会自动启动Linux内核,这个功能就是由这个函数实现的
cli_loop:uboot的命令行处理函数,我们在 uboot中输入各种命令,进行各种操作就是有 cli_loop来处理的
3、bootm启动linux内核用到的函数:
全局变量 images会在 bootm命令的执行中频繁使用到,相当于 Linux内核启动的“灵魂”。
bootm命令的执行函数为 do_bootm:行,主要作用是解析 bootm的命令参数和检查有没有子命令
do_bootm_states:来执行不同的 BOOT 阶段,这里要执行的 BOOT阶段有:
BOOTM_STATE_START,BOOTM_STATE_FINDOS、 BOOTM_STATE_FINDOTHER、
BOOTM_STATE_LOADOS、 BOOTM_STATE_RAMDISK、 BOOTM_STATE_OS_PREP、
BOOTM_STATE_OS_FAKE_GO和 BOOTM_STATE_OS_GO。
bootm_os_get_boot_func:来查找对应系统的启动函数,查找方法很简单,就是读取数组中指定元素。
do_bootm_linux:Linux系统对应的启动函数
kernel_entry:,看名字“内核 _进入”,说明此函数是进入 Linux内核的,此函数有三个参数 zero arch params,第一个参数 zero要 为 0;第二个参数为机器 ID;第三个参数 ATAGS或者设备树 (DTB)首地 址, ATAGS是传统的方法,用于
传递一些命令行信息啥的,如果使用设备树的话就要传递设备树 (DTB)。
调用 kernel_entry函数进入 Linux内核,此行将一去不复返, uboot的使命也就完成了
流程图: