mkimage使用详解

通常,u-boot为kernel提供一些kernel无法知道的信息,比如ramdisk在RAM中的地址。Kernel也必须为U-boot提 供必要的信息,如通过mkimage这个工具(在u-boot代码的tools目录中,可以将其拷到/usr/bin/,以后方便使用,注意保持权限)可以给zImage添加一个header,也就是使得通常编译的内 核zImage添加一个数据头,把添加头后的image通常叫uImage,uImage是可以被U-boot直接引导的内核镜像。那么如何使用 mkimage工具而产生uImage的呢?下面将具体介绍mkimage工具的使用:
 
1.首先查看mkimage的命令参数
[root@localhost tools]# ./mkimage
Usage: ./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'   //用于指定CPU类型,比如ARM
          -O ==> set operating system to 'os'  //用于指定操作系统,比如Linux
          -T ==> set image type to 'type'      //用于指定image类型,比如Kernel
          -C ==> set compression type 'comp'   //指定压缩类型
          -a ==> set load address to 'addr' (hex)  //指定image的载入地址
          -e ==> set entry point to 'ep' (hex)     //内核的入口地址,一般是:image的载入地址+0x40(信息头的大小)
          -n ==> set image name to 'name'          //image在头结构中的命名
          -d ==> use image data from 'datafile'    //无头信息的image文件名
          -x ==> set XIP (execute in place)        //设置执行位置

参数说明:

-A 指定CPU的体系结构:
取值 表示的体系结构
alpha Alpha
arm ARM
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个字节的头)
-n 指定映象名
-d 指定制作映象的源文件

一、在开始之前先说明一下bootm相关的东西。
1、 首先说明一下,S3C2410架构下的bootm只对sdram中的内核镜像文件进行操作(好像AT91架构提供了一段从flash复制内核镜像的代码, 不过针对s3c2410架构就没有这段代码,虽然可以在u-boot下添加这段代码,不过好像这个用处不大),所以请确保你的内核镜像下载到sdram 中,或者在bootcmd下把flash中的内核镜像复制到sdram中。

2、-a参数后是内核的运行地址,-e参数后是入口地址。

3、
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的头部。


2.制作添加头的uImage

[root@localhost boot]# ./mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n linux-2.6.13 -d zImage uImage
Image Name:   linux-2.6.13
Created:      Sat Dec 20 19:42:38 2008
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    1588584 Bytes = 1551.35 kB = 1.51 MB
Load Address: 0x30008000
Entry Point:  0x30008040
注意:大家可以根据创建的头信息来验证个参数的含义。比如Image Name就是-n选项指定的内容,Load Address就是-a选项指定的内容,Entry Point就是-e选项指定的内容。

如果uImage的下载地址不是0x30008000,两个入口地址就是一样的;如果uImage的下载是0x30008000,相对应的入口地址要增加0X40。

3.下载并执行uImage。

u-boot(armzone)=> tftp 30008000 uImage
TFTP from server 192.168.0.3; our IP address is 192.168.0.7
Filename 'uImage'.
Load address: 0x30008000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         ###################################################
done
Bytes transferred = 1588648 (183da8 hex)
u-boot(armzone)=> bootm
## Booting image at 30008000 ...
   Image Name:   linux-2.6.13
   Created:      2008-12-20  11:42:38 UTC
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    1588584 Bytes =  1.5 MB
   Load Address: 30008000
   Entry Point:  30008040
   Verifying Checksum ... OK
   XIP Kernel Image ... OK
boot linux

Starting kernel ...

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

该实验基于QT2410E开发板进行,该开发板具体介绍参考:http://www.top-e.org/page/jgsz/index.php

 

转自:http://blog.csdn.net/topembedded/article/details/3581871

http://buaadallas.blog.51cto.com/399160/107808

 

posted @ 2013-01-18 00:23  wust.zjf  阅读(1471)  评论(0编辑  收藏  举报