首页 > 代码库 > zImage和uImage的区别

zImage和uImage的区别

http://blog.csdn.net/maojudong/article/details/4178118

 

zImage和uImage的区别

 一、vmlinuz

vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。

vmlinuz 的建立有两种方式。一是编译内核时通过“make zImage”创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”产生。zImage适用于 小内核的情况,它的存在是为了向后的兼容性。

二 是内核编译时通过命令make bzImage创建,然后通过:“cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”产生。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起 误解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。

二、initrd-x.x.x.img

initrd是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。

initrd 映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它Linux发行版或 许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd下面的命令创建initrd映象文件。

 

最后生成的内核镜象有两种zImage以及uImage。其中zImage下载到目标板中后,可以直接用uboot的命令go来进行直接跳转。这时候内核直接解压启动。但是无法挂载文件系统,因为go命令没有将内核需要的相关的启动参数传递给内核。传递启动参数我们必须使用命令bootm来进行跳转。Bootm命令跳转只处理uImage的镜象。

uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。

mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么

用法如下:

./mkimage -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个字节的头)

 

-n 指定映象名

 

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

我在编译时用到的命令如下:

# make zImage      //生成zImage镜象

/usr/local/arm/k9uboot/tools/mkimage -n ‘Linux 2.4.27‘ -A arm -O linux -T

kernel -C none -a 0x20007fc0 -e 0x20008000 -d zImage uImage

 

内核镜象已经准备好了,这个时候我们就要来准备文件系统了。由于时间缘故,本人暂时采用的是其他人已经好的文件系统k9.img.gz。这个时候我们要做的是,自己写一个简单hello.c的程序,编译通过后加入到该文件系统中,然后下载到目标板中运行。

先编写hello.c

编译:

#/usr/local/arm/2.95.3/bin/arm-linux-gcc  –o start-hello hello.c

编译后生成可执行文件start-hello

下面我们就必须把该执行文件加入到文件系统中去,步骤如下:

#gunzip  k9.img.gz                     //解压缩

#mount –o loop k9.img  /mnt/new_disk    //挂载

#cp start-hello  /mnt/new_disk           //将文件拷贝到文件系统中

#cd  /mnt/new_disk

#umount /mnt/new_disk                 //卸载

#gzip –c –v9 k9.img > k9.img.gz          //压缩 生成最终的文件系统

 

下面我们就要下载内核以及准备好文件系统了,这边先说明我的内存分配情况如下:

Flash

0x10000000 ――― 0x10020000     boot

0x10020000 ――― 0x10040000     uboot

0x10040000 ――― 0x10060000     uboot env

0x10060000 ――― 0x10200000     kernel

0x10200000 ――― 0x11000000     ramdisk

 

Sdram

0x20007fc0 ――― 0x20a00000     kernel

0x20a00000 ―――                ramdisk

 

Loadb  通过串口下载数据到ram

cp.b    拷贝ram中的数据到flash中。

 

kernel以及文件系统ramdisk下载完毕之后,我们还需要设置uboot的环境变量,这样uboot才能够在上电启动的时候启动内核等操作。环境变量设置如下:

Set cpfltoram cp.b 10200000 20a00000 18ffff            //拷贝文件系统到ram

Set boot bootm 20007fc0                            //启动kernel

Set bootcmd run cpfltoker/;run cpfltoram/;run boot       //uboot复位的执行指令

 

Set cpfltoker cp.b 10060000 20007fc0 f4fff             //拷贝内核到ram

Set bootargs root=/dev/ram rw initrd=0x20a00000,4M init=/linuxrc console=ttyS0,11520

0,mem=32m                      //uboot传递给内核的启动参数

 

 

 

http://sunhualing.spaces.live.com/blog/cns!7C7EDE32519133D6!165.trak

 

 

 

 

 

 

 

 

对于Linux内核,编译可以生成不同格式的映像文件,例如:
# make zImage
# make uImage

    zImage是ARM Linux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。另外,Linux2.4内核不支持uImage,Linux2.6内核加入了很多对嵌入式系统的支持,但是uImage的生成也需要设置。

vmlinux  编译出来的最原始的内核文件,未压缩。

zImage   是vmlinux经过gzip压缩后的文件。

bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。

uImage   U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。

vmlinuz  是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。

initrd   是“initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。

 

 

 

 

 

 

 

 

vmlinux是内核文件,

zImage是一般情况下默认的压缩内核映像文件,压缩vmlinux,加上一段解压启动代码得到,只能从0X0地址运行。

bzImage在uClinux中很少见到。

uImage是u-boot使用bootm命令引导的Linux压缩内核映像文件格式,
使用工具mkimage对普通的压缩内核映像文件(zImage)加工而得。可以由bootm命令从任意地址解压启动内核。

由于bootloader一般要占用0X0地址,所以,uImage相比zImage的好处就是可以和bootloader共存。

制作uImage的mkimage软件,如果uClinux-dist有的话,一般放在uClinux-dist的tools目录中。
 
 
 
 
yingc@yingc:~/work/gitcode/1.9.2-dev/linux-2.6.27.55/arch/csky/boot$ hexdump -n 128 -C zImage 00000000  00 12 00 12 00 12 00 12  00 12 00 12 00 12 00 12  |................|00000010  82 18 93 18 f1 33 81 34  01 18 4f 78 02 60 65 61  |.....3.4..Ox.`ea|00000020  66 65 07 60 d9 2c 98 1f  87 1e 68 3e 85 1e 86 1e  |fe.`.,....h>....|00000030  1f 00 b1 33 41 6f 32 6f  15 6f 1e 6f 27 6f c2 33  |...3Ao2o.o.o‘o.3|00000040  42 6f 27 11 b7 34 67 34  57 34 47 34 27 19 43 71  |Bo‘..4g4W4G4‘.Cq|00000050  44 72 02 91 11 18 43 71  40 74 43 75 44 76 44 77  |Dr....Cq@tCuDvDw|00000060  45 7d 10 12 10 0f 10 05  00 e8 43 71 44 72 12 05  |E}........CqDr..|00000070  22 3e 03 60 01 93 31 20  b2 01 fc e7 41 74 3a 75  |">.`..1 ....At:u|00000080yingc@yingc:~/work/gitcode/1.9.2-dev/linux-2.6.27.55/arch/csky/boot$ hexdump -n 128 -C uImage 00000000  27 05 19 56 c1 79 97 9a  54 85 18 47 00 17 72 00  |‘..V.y..T..G..r.|00000010  90 00 00 00 90 00 00 00  84 e5 ae 03 05 05 02 00  |................|00000020  4c 69 6e 75 78 2d 32 2e  36 2e 32 37 2e 35 35 00  |Linux-2.6.27.55.|00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|00000040  00 12 00 12 00 12 00 12  00 12 00 12 00 12 00 12  |................|00000050  82 18 93 18 f1 33 81 34  01 18 4f 78 02 60 65 61  |.....3.4..Ox.`ea|00000060  66 65 07 60 d9 2c 98 1f  87 1e 68 3e 85 1e 86 1e  |fe.`.,....h>....|00000070  1f 00 b1 33 41 6f 32 6f  15 6f 1e 6f 27 6f c2 33  |...3Ao2o.o.o‘o.3|00000080yingc@yingc:~/work/gitcode/1.9.2-dev/linux-2.6.27.55/arch/csky/boot$ 

 

yingc@yingc:~/work/gitcode/1.9.2-dev/linux-2.6.27.55/arch/csky/boot$ hexdump -n 128 -C zImage
00000000  00 12 00 12 00 12 00 12  00 12 00 12 00 12 00 12  |................|
00000010  82 18 93 18 f1 33 81 34  01 18 4f 78 02 60 65 61  |.....3.4..Ox.`ea|
00000020  66 65 07 60 d9 2c 98 1f  87 1e 68 3e 85 1e 86 1e  |fe.`.,....h>....|
00000030  1f 00 b1 33 41 6f 32 6f  15 6f 1e 6f 27 6f c2 33  |...3Ao2o.o.o‘o.3|
00000040  42 6f 27 11 b7 34 67 34  57 34 47 34 27 19 43 71  |Bo‘..4g4W4G4‘.Cq|
00000050  44 72 02 91 11 18 43 71  40 74 43 75 44 76 44 77  |Dr....Cq@tCuDvDw|
00000060  45 7d 10 12 10 0f 10 05  00 e8 43 71 44 72 12 05  |E}........CqDr..|
00000070  22 3e 03 60 01 93 31 20  b2 01 fc e7 41 74 3a 75  |">.`..1 ....At:u|
00000080
yingc@yingc:~/work/gitcode/1.9.2-dev/linux-2.6.27.55/arch/csky/boot$ hexdump -n 128 -C uImage
00000000  27 05 19 56 c1 79 97 9a  54 85 18 47 00 17 72 00  |‘..V.y..T..G..r.|
00000010  90 00 00 00 90 00 00 00  84 e5 ae 03 05 05 02 00  |................|
00000020  4c 69 6e 75 78 2d 32 2e  36 2e 32 37 2e 35 35 00  |Linux-2.6.27.55.|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 12 00 12 00 12 00 12  00 12 00 12 00 12 00 12  |................|
00000050  82 18 93 18 f1 33 81 34  01 18 4f 78 02 60 65 61  |.....3.4..Ox.`ea|
00000060  66 65 07 60 d9 2c 98 1f  87 1e 68 3e 85 1e 86 1e  |fe.`.,....h>....|
00000070  1f 00 b1 33 41 6f 32 6f  15 6f 1e 6f 27 6f c2 33  |...3Ao2o.o.o‘o.3|
00000080
yingc@yingc:~/work/gitcode/1.9.2-dev/linux-2.6.27.55/arch/csky/boot$

zImage和uImage的区别