昨天用到了的工具,好久不用突然生疏,有点疑问,对于裁剪完成编译生成的内核镜像有三种基本格式:
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
|