如果板子启动以后不按任何键,将会默认启动Linux内核。
我们回到/common/main.c中,首先
s = getenv ("bootcmd");
然后
run_command (s, 0);
bootcmd是一个环境变量,它的值对应一些命令,用来启动linux
"bootcmd=" CONFIG_BOOTCOMMAND "\0"
/include/configs/mini2440.h
#define CONFIG_BOOTCOMMAND "nfs 0x30008000 192.168.0.1:/home/tekkaman/working/nfs/zImage.img;bootm"
Nfs这种情况先不讨论,更一般的是这种:
#define CONFIG_BOOTCOMMAND "nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0;bootm"
这是两个命令,先看nand read.jffs2 0x30007FC0 kernel,这个命令的作用是从nandflash的kernel分区中读取数据到SDRAM中的0x30007FC0。
对于mini2440,将整块nandflash分成了很多个区:
/include/configs/mini2440.h
#define MTDPARTS_DEFAULT "mtdparts=nandflash0:384k(bootloader)," \
"128k(params)," \
"5m(kernel)," \
"-(root)"
所以从nand的0地址开始:384KB的uboot,128KB的params,5M的内核,然后是root。
还有另一条命令bootm,解析bootm后uboot最终执行do_bootm函数(uboot怎么样对命令解析并执行的,前面讲过了)。
/common/cmd_bootm.c
/*******************************************************************/
/* bootm - boot application image from image in memory */
/*******************************************************************/
<p>int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])</p><p>{</p><p>...</p><p>}</p>
参数:
cmdtp,命令结构体指针,指向bootm对应的命令结构体
flag,不了解
argc,参数的个数
argv,指向参数
在do_bootm