u-boot启动流程

时间:2021-05-30 16:44:41

最近开始学习u-boot ,下载了一个jz4750基于u-boot -1.1.6的包和补丁。感觉启动流程比较混乱,所以把它疏理了一下,便于后期详细分析代码。现在我配置的启动模式是tftpboot;bootm,启动内核后通过NFS挂载根文件系统。

 

下面把代码详细的启动步骤记录下来。u-boot启动时首先会先到CPU目录下面去找对应CPU文件夹下面的start.s,由于我们是分析启动流程,所以不对代码进行详细的讲解,jz4750的start.s都在/CPU/MIPS目录下面,从start.s代码可以看到u-boot首先运行的C程序为/lib_mips目录下面的board.c文件中的board_init_f函数,该函数主要根据init_sequence表,逐个运行初始化函数,完成后返回start.s执行,再跳到board.c中的board_init_r函数,该函数主要进行一些初始化后转到/common下面main.c中的main_loop函数中,执行交互式的底层操作,可对用户输入的各种命令进行解析并执行,如果按照目前的设置u-boot会去执行 run_command函数,该函数会在

while (*str)位置处解析出tftpboot和bootm两条命令。首先来看tftpboot的流程,解析出来执行(cmdtp->cmd) (cmdtp, flag, argc, argv)

实际上就是cmd_net.c中的

 

U_BOOT_CMD(
 tftpboot, 3, 1, do_tftpb,
 "tftpboot- boot image via network using TFTP protocol/n",
 "[loadAddress] [bootfilename]/n"
);

 

即tftpb函数,该函数继续执行的流程为netboot_common-》NetLoop(网络加载循环)-》TftpStart(启动加载)=》在NetLoop函数中的for循环里面循环加载直到状态变为NETLOOP_SUCCESS,跳出循环后返回完成tftpboot命令。

 

tftpboot命令完成后返回到run_command中,继续执行bootm命令,bootm命令被定位到cmd_bootm.c中

 

U_BOOT_CMD(
  bootm, CFG_MAXARGS, 1, do_bootm,
  "bootm   - boot application image from memory/n",
  "[addr [arg ...]]/n    - boot application image stored in memory/n"
  "/tpassing arguments 'arg ...'; when booting a Linux kernel,/n"
  "/t'arg' can be the address of an initrd image/n"
#ifdef CONFIG_OF_FLAT_TREE
 "/tWhen booting a Linux kernel which requires a flat device-tree/n"
 "/ta third argument is required which is the address of the of the/n"
 "/tdevice-tree blob. To boot that kernel without an initrd image,/n"
 "/tuse a '-' for the second argument. If you do not pass a third/n"
 "/ta bd_info struct will be passed instead/n"
#endif
);

 

即do_bootm函数,该函数继续执行的流程对文件头进行判断后进行处理在转到/lib_mips/mips_linux.c中的do_bootm_linux函数,设置内核所需的环境变量后调用theKernel运行内核。

 

再此转向去执行内核文件,这里描述比较粗略,主要用于阅读代码所用。