UBOOT启动流程——向量表重定位命令处理——学习笔记

Posted 西邮菜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UBOOT启动流程——向量表重定位命令处理——学习笔记相关的知识,希望对你有一定的参考价值。

一、向量表重定位relocate_vectors

重定位后uboot的首地址放入r0寄存器中,因为向量表肯定就是从这个地方开始存放的,再将r0中记录的地址写入到CP15的VBAR寄存器中,就是将新的向量表首地址写入到寄存器VBAR中,设置向量表偏移。

二、board_init_r

board_init_f并没有初始化所有的外设,需要board_init_r函数完成后续操作。主要就是初始化一些外设和gd的成员变量

调用init_sequence_r函数集合完成一系列的初始化,(这里做什么初始化看手册)初始完后进入倒计时(run_main_loop函数),倒计时结束前按回车键可以进入uboot的命令行模式,如果没有按键回车键,倒计时结束后调用函数run_command_list执行命令bootcmd来启动内核。

如果进入uboot命令行,需要接收处理我们输入的命令,初始化input成员变量,之后用hush shell命令解释器接收命令行的输入,并执行相应的命令。

执行命令的过程:首先解析命令,再执行命令。

1、解析命令,调用cmd_process处理命令,首先先了解uboot的命令,在u_boot.lds中可以看到命令都存在.u_boot_list段中,使用U_BOOT_CMD宏定义来定义一个命令,就是为了定义一个cmd_tbl_t的结构体变量,找到命令对应的do_××()函数。

find_cmd找到对应命令后返回他的cmd_tbl_t构体变量。

U_BOOT_CMD(
 dhcp, 3, 1, do_dhcp,
 "boot image via network using DHCP/TFTP protocol",
 "[loadAddress] [[hostIPaddr:]bootfilename]"
);
1、将 U_BOOT_CMD 展开后为:
U_BOOT_CMD_COMPLETE(dhcp, 3, 1, do_dhcp,
 "boot image via network using DHCP/TFTP protocol",
 "[loadAddress] [[hostIPaddr:]bootfilename]",
 NULL)
 
2、将 U_BOOT_CMD_COMPLETE 展开后为:
ll_entry_declare(cmd_tbl_t, dhcp, cmd) = \\
U_BOOT_CMD_MKENT_COMPLETE(dhcp, 3, 1, do_dhcp, \\
 "boot image via network using DHCP/TFTP protocol", \\
 "[loadAddress] [[hostIPaddr:]bootfilename]", \\
 NULL);
 
3、将 ll_entry_declare 和 U_BOOT_CMD_MKENT_COMPLETE 展开后为: 
cmd_tbl_t _u_boot_list_2_cmd_2_dhcp __aligned(4) \\
 __attribute__((unused,section(.u_boot_list_2_cmd_2_dhcp))) \\ 
  "dhcp", 3, 1, do_dhcp, \\
 "boot image via network using DHCP/TFTP protocol", \\
 "[loadAddress] [[hostIPaddr:]bootfilename]",\\
 NULL

2、运行命令,cmd_call函数接收到返回的cmd_tbl_t的结构体,通过他的成员变量cmd来调用do_××。

后面可以使用bootz来启动内核,uboot就是个裸机代码,从__start开始到启动linux内核,他就完成任务了。

下面引用一个大神的图来说明uboot的启动流程:

 

以上是关于UBOOT启动流程——向量表重定位命令处理——学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

新版本uboot启动流程分析

uboot 2014.04 运行过程记录

Linux嵌入式驱动学习之路⑦Linux内核启动流程

一,移植uboot,分析uboot启动流程

Uboot启动流程分析

展讯平台uboot启动流程