基于讯为源码( iTop4412_uboot_20151119.tar.gz )的 UBoot 启动过程梳理。
- Board: iTOP-4412 POP 1G Elite(精英板)
- Boot Loader: u-boot-2010.03
stage 1(汇编)
1 | # ENTRY(_start) @ u-boot.lds |
stage 2(C)
1 | // lib_arm/board.c |
main loop
1 | // common/main.c |
run command
1 | // common/command.c |
可以看到,run_command
的主要过程是在 &__u_boot_cmd_end - &__u_boot_cmd_start
之间匹配输入命令的字符串。
在头文件中有如下声明:
1 | // include/command.h |
链接文件中又有如下声明:
1 | // u-boot.lds |
此声明意思如下:将声明 section 为 .u_boot_cmd
的变量都将被存放在 .u_boot_cmd
段中,.u_boot_cmd
段在 __u_boot_cmd_start
和 __u_boot_cmd_end
地址之间。
结合头文件声明,我们可以使用 U_BOOT_CMD
来”注册”运行命令。以 bdinfo 命令为例:
1 | // cmd_bdinfo.c |
通过编译产生的 System.map
可以查到当前 U-Boot 支持的所有命令。
1 | c3e40bb4 A __u_boot_cmd_start |