Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2696581
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: 嵌入式

2014-03-21 16:24:31

原文地址:uImage制作 作者:涛声508

找了网上的一些博客:
 
kernel文件:
arch/arm/boot/Makefile 62行开始有命令和规则:
quiet_cmd_uimage = UIMAGE  $@
      cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \
           -C none -a $(ZRELADDR) -e $(ZRELADDR) \
           -n 'Linux-$(KERNELRELEASE)' -d $< $@
$(obj)/uImage:  $(obj)/zImage FORCE
    $(call if_changed,uimage)
    @echo '  Image $@ is ready'
 
其实uboot启动映像主要是在原来的zImage前加上一个他要0x40的tag,告诉uboot一些关于内核启动的信息。这个规则的命令就是63行到65行的定义
 
 
上面文件中在24行定义

ZRELADDR    := $(zreladdr-y)
在第17行有
include $(srctree)/$(MACHINE)/Makefile.boot
 
而这个Makefile.boot的中有
 
   zreladdr-y  := 0x30008000
 
所以ZRELADDR    := 0x30008000
 
如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同。
(1)如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉头部的内核复制到-a指定的load地址中去运行之
(2)如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。
对于生成uImage时使用-C NONE时,u-boot只是简单的将image0x30800000搬到-a 指定的地址。对于 –C gzip u-boot将会跳过image 64Byte的头部分,将压缩的内核解压缩到-a指定的地址,所以bootm 后面跟的地址和-a 的地址最好要有一定的间隔。-e 选项指定解压缩后内核的入口地址,这一地址要和内核生成时的地址保持一致。

 
阅读(875) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~