由于uboot的不支持直接引导zImage内核镜像,所以寻思添加命令使其可以直接引导zImage,其实网上已有牛人早实现了,只是有些地方不太清除,所以这里也算是整理一下。
主要修改文件:
1、添加命令bootzImage,实现文件为cmd_bootzImage.c,位于common/目录下,内容为:
1 #include <common.h> 2 #include <command.h> 3 4 #ifdef CONFIG_CMD_BOOTZIMAGE 5 6 #define LINUX_PAGE_SHIFT 12 7 #define LINUX_PAGE_SIZE (1<<LINUX_PAGE_SHIFT) 8 #define LINUX_MACHINE_ID 1099//根据平台修改 9 10 void do_bootzImage(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 11 { 12 int i; 13 u32 addr; 14 char *cmdline = getenv("bootargs"); 15 void(*run)(int zero, int arch); 16 struct param_struct *params = (struct param_struct *)0x20000100;//这里要注意根据平台的不同修改,
//一般 约定俗成是内存首地址+100dex 17 18 if(argc < 2){ 19 addr = load_addr; //默认加载地址 20 } 21 else{ 22 addr = simple_strtoul(argv[1], NULL, 16); 23 } 24 25 for(i=0; i<(sizeof(struct param_struct)>>2); i++){ 26 ((u32 *)params)[i] = 0; 27 } 28 29 params->u1.s.page_size = LINUX_PAGE_SIZE; 30 params->u1.s.nr_pages = (0x04000000 >> LINUX_PAGE_SHIFT); 31 32 memcpy(params->commandline, cmdline, strlen(cmdline)); 33 run = (void(*)(int, int))addr; 34 printf("start kernel.../n"); 35 run(0, LINUX_MACHINE_ID); 36 37 } 38 39 U_BOOT_CMD( 40 bootzImage, 2, 1, do_bootzImage, 41 "bootzImage --boot zImage from ram./n", 42 "[addr] boot zImage directoly." 43 ); 44 45 #endif
2、在common/Makefile中添加COBJS-$(CONFIG_CMD_BOOTZIMAGE) +=cmd_bootzImage.o
3、在配置文件中添加#define CONFIG_CMD_BOOTZIMAGE