您的位置:首页 > 运维架构 > Linux

vmlinux,zImage,bzImage,vmlinuz,uImage,关系

2011-04-07 15:27 176 查看
本文转自 http://blog.csdn.net/maojudong/archive/2009/05/13/4178118.aspx

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目录中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: