邮箱:zhuimengcanyang@163.com 痴爱嵌入式技术的蜗牛
分类: 嵌入式
2016-12-31 14:48:04
u-boot.lds是连接脚本,其中定义了一个特殊的段(.u_boot_cmd),用于存储bootmenu中可以使用的命令。
在文件u-boot.lds中有如下定义:
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
该段的含义为定义一个新段.u_boot_cmd。__u_boot_cmd_start为该段的第一个符号;__u_boot_cmd_end为该段的最后一个符号。
如果要把一个变量放入.u_boot_cmd段,需要通过宏U_BOOOT_CMD实现。宏的定义如下:
#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))
#define U_BOOT_CMD(name, maxargs, rep,cmd, usage, help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage}
例如:
我们定义变量
U_BOOT_CMD(bootm, 16, 1, do_bootm, “bootm--usage”, “help”)
展开后为:
cmd_tbl_t __u_boot_cmd_ bootm Struct_Section =
{“bootm”, 16, 1, do_bootm, “bootm--usage”}
如果把Struct_Section也展开,则为:
cmd_tbl_t __u_boot_cmd_ bootm __attribute__ ((unused,section (".u_boot_cmd"))) = \
{“bootm”, 16, 1, do_bootm, “bootm--usage”}
__attribute__((section(“bar”)))命令用于把某个符号放到特定段中,因此在这里符号__u_boot_cmd_ bootm会被放入段.u_boot_cmd中。
Uboot中所有命令都是存放在这个特殊段中的。当用户输入一个命令时(需要与定义时的name变量同名),会在函数find_cmd中从__u_boot_cmd_start开始循环匹配,匹配到后就执行对应变量中的cmd项;如果直到__u_boot_cmd_end也没有发现,则匹配失败。
例如:用户输入bootm,会找到__u_boot_cmd_bootm这个变量,然后会取出cmd命令(这里注册的是do_bootm)来执行。