zImage和uImage的区别

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

 

 一、 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 传递给内核的启动参数

 

设置完毕后, saveenv 把环境变量存储起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值