zImage和uImage的区别


 

一、简介

 

对于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是“initialramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。vmlinux是内核文件,zImage是一般情况下默认的压缩内核映像文件,压缩vmlinux,加上一段解压启动代码得到,只能从0X0地址运行。

uImage是u-boot使用bootm命令引导的Linux压缩内核映像文件格式,使用工具mkimage对普通的压缩内核映像文件(zImage)加工而得。可以由bootm命令从任意地址解压启动内核。由于bootloader一般要占用0X0地址,所以,uImage相比zImage的好处就是可以和bootloader共存。

二、vmlinuz

vmlinuz是可引导的、压缩的内核。“vm”代表“VirtualMemory”。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发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:manmkinitrd下面的命令创建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 -aaddr -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                  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 指定制作映象的源文件

 

四、示例

 

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

# 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

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

 

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\;runcpfltoram\;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传递给内核的启动参数

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值