bootm,CFG_MAXARGS,1,do_bootm,
“string1”,
“string2”
);
宏U_BOOT_CMD扩展开后就是:
cmd_tbl_t __u_boot_cmd_bootm __attribute__
((unused,section (".u_boot_cmd"))) = {“bootm”, CFG_MAXARGS, 1,
do_bootm, “string1”, “string2”};
对于每个使用U_BOOT_CMD宏来定义的命令,其实都是在".u_boot_cmd"段中定义一个cmd_tbl_t结构。连接脚本u-boot.lds中有这么一段:
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
程序中就是根据命令的名字在内存段__u_boot_cmd_start~__u_boot_cmd_end找到它的cmd_tbl_t结构,然后调用它的函数(请参考common/command.c中的find_cmd函数)。
内核的复制和启动,可以通过如下命令来完成:bootm从内存、ROM、NOR
Flash中启动内核,bootp则通过网络来启动,而nboot从NAND
Flash启动内核。它们都是先将内核映像从各种媒介中读出,存放在指定的位置;然后设置标记列表以给内核传递参数;最后跳到内核的入口点去执行。具体实
现的细节不再描述,有兴趣的读者可以阅读common/cmd_boot.c、common/cmd_net.c、common/cmd_nand.c来
了解它们的实现。
(4)为内核设置启动参数。
与15.1.2小节中《Bootloader与内核的交互》所描述的一样,U-Boot也是
通过标记列表向内核传递参数。并且,15.1.2小节中内存标记、命令行标记的示例代码就是取自U-Boot中的setup_memory_tags、
setup_commandline_tag函数,它们都是在lib_arm/armlinux.c中定义。一般而言,设置这两个标记就可以了,在配置文
件include/configs/smdk2410.h中增加如下两个配置项即可:
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_CMDLINE_TAG 1
对于ARM架构的CPU,都是通过lib_arm/armlinux.c中的
do_bootm_linux函数来启动内核。这个函数中,设置标记列表,最后通过“theKernel (0,
bd->bi_arch_number,
bd->bi_boot_params)”调用内核。其中,theKernel指向内核存放的地址(对于ARM架构的CPU,通常是
0x30008000),bd->bi_arch_number就是前面board_init函数设置的机器类型ID,而
bd->bi_boot_params就是标记列表的开始地址。
2.5 U-Boot的移植
开发板smdk2410的配置适用于大多数S3C2410单板,或是只需要极少的修改即可使用。但是目前U-Boot中没有对S3C2440的支持,需要我们自己移植。
本书基于的S3C2410、S3C2440两款开发板,它们的外接硬件相同:
BANK0外接容量为1MB,位宽为8的NOR Flash芯片AM29LV800
BANK3外接10M网卡芯片CS8900,位宽为16
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-66092-15.html
人家那演双簧
有童年有梦想有希望也需要坚持