/********************************************************************************/
u-boot命令尋找分析
/**************************************************************************** find command table entry for a command*/
cmd_tbl_t *find_cmd (constchar*cmd){cmd_tbl_t *cmdtp;cmd_tbl_t *cmdtp_temp =&__u_boot_cmd_start;/*Init value */constchar*p;int len;int n_found =0;/** Some commands allow length modifiers (like "cp.b");* compare command name only until first dot.*/len =((p =strchr(cmd,'.'))==NULL)? strlen (cmd):(p - cmd);for(cmdtp =&__u_boot_cmd_start;cmdtp !=&__u_boot_cmd_end;cmdtp++){if(strncmp (cmd, cmdtp->name, len)==0){if(len == strlen (cmdtp->name))return cmdtp;/* full match */cmdtp_temp = cmdtp;/* abbreviated command ? */n_found++;}}if(n_found ==1){/* exactly one match */return cmdtp_temp;}returnNULL;/* not found or ambiguous command */}for(cmdtp =&__u_boot_cmd_start;cmdtp !=&__u_boot_cmd_end;cmdtp++)u-boot.lds的鏈接腳本之中也能傳遞變量
SECTIONS
{.=0x00000000;.=ALIGN(4);.text :{cpu/arm920t/start.o (.text)board/100ask24x0/boot_init.o (.text)*(.text)}.=ALIGN(4);.rodata :{*(.rodata)}.=ALIGN(4);.data :{*(.data)}.=ALIGN(4);.got :{*(.got)}.=.;__u_boot_cmd_start =.;.u_boot_cmd :{*(.u_boot_cmd)}__u_boot_cmd_end =.;.=ALIGN(4);__bss_start =.;.bss :{*(.bss)}_end =.;}#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))#ifdef CFG_LONGHELP#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage, help}#else/* no long help info */rep命令代表的是命令是否可重復
#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage} nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0U_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);cmd_tbl_t __u_boot_cmd_bootm __attribute__ ((unused,section (".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"}
在宏定義中 #是轉化為字符串的意思
下面這句的意思是設置該結構體段屬性為.u_boot_cmd
cmd_tbl_t __u_boot_cmd_bootm __attribute__ ((unused,section (".u_boot_cmd")))
因此只要是定義為 U_BOOT_CMD 類型的結構體都將被強制轉化為 段的屬性為 .u_boot_cmd 該屬性在鏈接腳本中定義了
因此在find_cmd中能夠使用
for(cmdtp =&__u_boot_cmd_start;cmdtp !=&__u_boot_cmd_end;cmdtp++)
將明令挨個找出來