Chinaunix首页 | 论坛 | 博客
  • 博客访问: 317433
  • 博文数量: 239
  • 博客积分: 481
  • 博客等级: 下士
  • 技术积分: 1170
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-15 17:28
文章分类

全部博文(239)

文章存档

2014年(13)

2013年(6)

2012年(122)

2011年(98)

分类:

2011-07-29 20:37:29

昨天用到了的工具,好久不用突然生疏,有点疑问,对于裁剪完成编译生成的内核镜像有三种基本格式:
 
image++++++++++++++zImage++++++++++uImage++++++++
对于image是正常生成的镜像格式,make 编译生成的。
对于zImage是生成image的压缩格式。make zImage
对于uImage是为u-boot专用格式定的镜像。
对于生成uImage有两种生成方式 在u-boot原码目录/tools目录下,有一个mkimage可执行文件
拷贝到系统/usr/bin/目录下 可以再系统目录下使用这个工具。
mkimage -l image
          -l ==> list image header information
       mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
          -A ==> set architecture to 'arch'
          -O ==> set operating system to 'os'
          -T ==> set image type to 'type'
          -C ==> set compression type 'comp'
          -a ==> set load address to 'addr' (hex)
          -e ==> set entry point to 'ep' (hex)
          -n ==> set image name to 'name'
          -d ==> use image data from 'datafile'
          -x ==> set XIP (execute in place)
A 指定CPU的体系结构:
取值 表示的体系结构
alpha Alpha
arm A RM
x86 Intel x86
ia64 IA64
mips MIPS
mips64 MIPS 64 Bit
ppc PowerPC
s390 IBM S390
sh SuperH
sparc SPARC
sparc64 SPARC 64 Bit
m68k MC68000
-O 指定操作系统类型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
-T 指定映象类型,可以取以下值:
standalone、kernel、ramdisk、multi、firmware、script、filesystem
C 指定映象压缩方式,可以取以下值:
none 不压缩
gzip 用gzip的压缩方式
bzip2 用bzip2的压缩方式
-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载
-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)
如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同。
(1)如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉头部的内核复制到-a指定的load地址中去运行之
(2)如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。
mkimage其实在zImage增加了一个Header,共64个字节。这个Header的结构如下所示(摘自:u-boot-200903/include/image.h):

typedef struct image_header {
     uint32_t ih_magic;
     uint32_t ih_hcrc;
     uint32_t ih_time;
     uint32_t ih_size;
     uint32_t ih_load;
     uint32_t ih_ep; 
     uint32_t ih_dcrc;
     uint8_t  ih_os; 
     uint8_t  ih_arch;
     uint8_t  ih_type;
     uint8_t  ih_comp;
     uint8_t  ih_name[IH_NMLEN];
    } image_header_t;

在image.h 中定义了很多image的信息。

-n 指定映象名
-d 指定制作映象的源文件

-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载
-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)
-n 指定映象名
-d 指定制作映象的源文件

[root@localhost tftpboot]#mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.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

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