U-Boot直接引导zImage内核

来源:互联网 发布:淘宝新店一天刷几单好 编辑:程序博客网 时间:2024/06/06 13:11

 

         U-boot1.1.6只能只能就能过mkimage工具加工后的内核镜像文件。mkimage工具给zImage增加了一个64B大小的头。U-Boot是通过bootm命令来引导Linux内核的,bootm命令调用do_bootm函数来mkimage工具增加的头,最后调用do_bootm_linux函数引导去掉了mkimage工具增加的头的Linux内核,也就是zImage,启动的流程可以参考图解U-Boot:引导内核分析这篇博客。

     要让U-Boot直接引导zImage内核,只需在do_bootm函数中去掉对mkimage工具增加的头的分析,直接调用do_bootm_linux函数引导zImage内核即可。下面是经过修改的do_bootm函数,修改的部分用///////////包围起来了,省略号后面的就不需要改动了。这个函数common/cmd_bootm.c文件中。

[plain] view plaincopyprint?
  1. int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) 
  2.     ulong   iflag; 
  3.     ulong   addr; 
  4.     ulong   data, len, checksum; 
  5.     ulong  *len_ptr; 
  6.     uint    unc_len = CFG_BOOTM_LEN; 
  7.     int i, verify; 
  8.     char    *name, *s; 
  9.     int (*appl)(int, char *[]); 
  10.     image_header_t *hdr = &header; 
  11.     s = getenv ("verify"); 
  12.     verify = (s && (*s == 'n')) ? 0 : 1; 
  13.     if (argc < 2) { 
  14.         addr = load_addr; 
  15.     } else { 
  16.         addr = simple_strtoul(argv[1], NULL, 16); 
  17.     } 
  18.     SHOW_BOOT_PROGRESS (1); 
  19. ////////////////////////////////////////////////////////////////////////////////// 
  20.     //printf ("## Booting image at %08lx ...\n", addr); 
  21.     printf ("## Booting from zImage at %08lx ---by ce123\n", addr); 
  22. #ifdef CONFIG_SILENT_CONSOLE 
  23.         fixup_silent_linux(); 
  24. #endif 
  25.         do_bootm_linux  (cmdtp, flag, argc, argv, 
  26.                  addr, len_ptr, verify); 
  27. ////////////////////////////////////////////////////////////////////////////////// 
  28. ...... 

接下来还要修改一下lib_arm/armlinux.c中的do_bootm_linux函数。这里主要是修改kernal的加载地址(theKernel = (void (*)(int, int, uint))addr)。这就要求我们将zImage内核下载内存的addr处。并且用bootm addr进行引导,默认的地址是0x30008000,如果直接使用bootm进行引导,则需要将内核下载到0x30008000,否则无法引导内核。

[plain] view plaincopyprint?
  1. void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[], 
  2.              ulong addr, ulong *len_ptr, int verify) 
  3.     ulong len = 0, checksum; 
  4.     ulong initrd_start, initrd_end; 
  5.     ulong data; 
  6.     void (*theKernel)(int zero, int arch, uint params); 
  7.     image_header_t *hdr = &header; 
  8.     bd_t *bd = gd->bd; 
  9.  
  10.  
  11. #ifdef CONFIG_CMDLINE_TAG 
  12.     char *commandline = getenv ("bootargs"); 
  13. #endif 
  14.  
  15.  
  16.     //theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep); 
  17.     theKernel = (void (*)(int, int, uint))addr; 

下面是引导信息:

U-Boot 1.1.6 (Mar 11 2012 - 14:06:15)


DRAM:  64 MB
Flash:  2 MB
NAND:  256 MiB
In:    serial
Out:   serial
Err:   serial
Hit any key to stop autoboot:  0

NAND read: device 0 offset 0x240000, size 0x200000
2097152 bytes read: OK
## Booting from zImage at 30008000 ---by ce123

Starting kernel ...

Uncompressing Linux.............................................................
............................................................. done, booting the
kernel.

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机圆点卡住屏幕不能动怎么办 苹果5s卡屏怎么也不动应该怎么办 苹果5s手机触摸屏太灵敏怎么办 苹果5s手机关机滑动失灵怎么办 苹果5s关机开机后没信号怎么办 苹果手机5s被弄关机了怎么办 华为荣耀5c换屏后触摸失灵怎么办 三星笔记本鼠标触摸板没反应怎么办 有米6x触摸屏不好使怎么办? 小米5s屏幕触摸没反应怎么办 苹果5s主屏幕设置没反应怎么办 华为畅享5s接听不灵怎么办 红米3s忘记锁屏密码怎么办 华为畅享5s手机打不开网络怎么办 苹果手机突然关机开不了机怎么办 苹果手机掉地上开不了机怎么办 oppo手机突然黑屏开不了机怎么办 苹果6s为什么开不了机怎么办 苹果手机还原出厂设置白苹果怎么办 捡到苹果6s手机怎么办才能自己用 苹果6s玩游戏卡住了怎么办 苹果6s进水换屏后指纹失灵怎么办 苹果手机6s声音按键失灵怎么办 苹果手机触屏失灵怎么办5s 苹果六摔了一下屏幕失灵怎么办 荣耀5c进水屏幕触摸屏失灵怎么办 生活玩家打不了风云蝙蝠岛怎么办啊 企鹅号在注册的时候选错领域怎么办 博士超期学信网的信息被删除怎么办 电脑账号删除后电脑开不了怎么办 lol不小心融错了皮肤怎么办 农村医保交费了没有录入系统怎么办 电动三轮车在泗阳被交警扣了怎么办 环评证实际的设备少报了怎么办 别人盗用了自己的社保卡怎么办 如果有人盗用社保卡信息住院怎么办 丈夫出轨生下孩子妻子该怎么怎么办 l老公偷着儿子消失了怎么办 老婆出轨怀孕现在流了他跑了怎么办 交通银行贷款资金户里面的钱怎么办 新车2个月出现好多小毛病怎么办