• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
梦想照进灵魂
博客园    首页    新随笔    联系   管理    订阅  订阅
Uboot引导kernel问题小结

Uboot引导kernel问题小结  

图1:

 

       问题一,wrong image format for bootm command问题

原来要用uboot的tools文件中的mkimage命令把zImage格式改成uImage格式。那么uboot就可以认识了。uImage比zImage多0x40个byte的头。

问题二,done, booting the kernel问题追踪

1,由于无法保存env。所以去查问题,发现原来nand write都无法写入。

   于是修改了s3c2410_nand.c文件,即解决了问题。

 2,怀疑typeID不对。后来进过打印信息,看uboot的id,没问题。然后看tq uboot的ID也是168,tq的uboot能引导。那么说明ID是正确的。

 3,于是没方向了。把参数设置为和tq的env参数一致,等等不同参数的设置,都尝试过了。不行。

 4,开始查uboot是如何引导kernel的源码流程。知道了在bootm.c文件中。但是uboot是如何调用kernel的呢?PC指针式如何指向的呢?后来才知道r0,r1,r2传递过去的。另外查了下kernel的地址是bootm告诉uboot的。

 5,接着无意间发现别人看30000100内存。我也想办法看内存信息,这样就知道要传递的参数是否正确了。

 6,于是发现kernel参数真的不正确。如图1:

  7,于是开始关注这些TAG及地址0x5442000x等。在apple2440.h中添加了宏开关后终于解决了问题。不过暂时发现CONFIG_INITRD_TAG定义了没有用。而我之前CONFIG_SETUP_MEMORY_TAGS宏是开了,但是CONFIG_CMDLINE_TAG没开,打开后,就能引导kernel了。

 

 

uboot问题:关于uboot引导uImage的问题
————————————————————
1、-a参数后是内核的运行地址,-e参数后是入口地址。

2、
1)如果我们没用mkimage对内核进行处理的话,那直接把内核下载到0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag建议是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。
 
2)如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同。
(1)如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉头部的内核复制到-a指定的load地址中去运行之
(2)如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。

————————————————————————————————
地址不相同时:
[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage uImage.img
Image Name:   linux-2.6.14
Created:      Fri Jan 12 17:14:50 2007
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0x30008000
Entry Point:  0x30008000 


地址不相同时:
[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img
Image Name:   linux-2.6.14
Created:      Fri Jan 12 17:14:50 2007
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0x30008000
Entry Point:  0x30008040


——————————————————————————————————
终于明白了freescale手册中用mkimage制作uImage的命令:
mkimage -A arm -O linux -T kernel -C none -a 0x90008000 -e 0x90008000 -n "Linux-<2.6.31>-xie-20110714-1" -d zImage-7-14 uImage-7-14
该命令属于实际loadaddr(0x90800000)与-a(0x90008000)选项后的地址不同,故uboot会分析64字节头部,然后将内核复制到0x90008000,并从入口地址运行内核。
————————————————————
如果要把内核载入到0x90008000这个地址,且使之能运行,mkimage的命令如下:
mkimage -A arm -O linux -T kernel -C none -a 0x90008000 -e 0x90008040 -n "Linux-<2.6.38>-xie-20110720-3-2" -d zImage-38-3 uImage-38-3
posted on 2013-07-17 09:57  梦想照进灵魂  阅读(5775)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3