zImage和uImage的区别摘自:
http://user.qzone.qq.com/85221810/blog/1247317141
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是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。 initrd 映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它Linux发行版或 许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd下面的命令创建initrd映象文件。 最后生成的内核镜象有两种zImage uboot mkimage 用法如下: ./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 取值表示的体系结构 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 -T standalone -C none gzip bzip2 -a -e -n -d 我在编译时用到的命令如下: # make zImage #/usr/local/arm/k9uboot/tools/ kernel -C none -a 0x20007fc0 -e 0x20008000 -d zImage 内核镜象已经准备好了,这个时候我们就要来准备文件系统了。由于时间缘故,本人暂时采用的是其他人已经好的文件系统k9.img.gz 先编写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 0x10040000 0x10060000 0x10200000 Sdram 0x20007fc0 0x20a00000 Loadb cp.b 将kernel Set cpfltoram cp.b 10200000 20a00000 18ffff Set boot bootm 20007fc0 Set bootcmd run cpfltoker\;run cpfltoram\;run boot Set cpfltoker cp.b 10060000 20007fc0 f4fff Set bootargs root=/dev/ram rw initrd=0x20a00000,4M init=/linuxrc console=ttyS0,11520 0,mem=32m 设置完毕后,saveenv 学习心得:zImage 和uImage 都是生成的可执行内核镜像文件 2者在u-boot中启动的方式分别是 go addr 与 bootm addr 来实现启动过程的 即对于zImage是通过 go 来进行引导 zImage 和 uImage 2者的关系 是 uImage 是zImage通过mkimage (u--boot下面tools下的工具)来生成的 结果是后者比前者在头部多了64个byte,这多余的64个byte是用来通知给u-boot用的;将相关信息告知u-boot; 这样做的结果在u-boot引导内核时存在2个地址:loadaddress 和entry address 2者的差值刚好是0x40(64byte)的大小 这样在使用bootm loadaddress 时u-boot会根据相应的loadaddress进行调整,有2中情况; 1)、当loadaddress与mkimage时传送的一致时: 2)、当loadaddress与mkimage时传送的不一致时: 总结,那么上面2中情况实际区别呢?其实就是最终代码执行时,如果地址与mkinage时指定的不符,那么u-boot将进行去头后,拷贝内核代码,直接执行;而如果不处理,则会将 loadaddress+0x40来执行内核; 通过tftp服务来下载 zImage或者uImage; loadb cp【.b\.w\.l】 完成 内存之间 内存向flash之间进行拷贝 最后可以设置 bootcmd 环境变量可以实现 u-boot自动引导内核启动 至于文件系统的2中方式:ramdisk 以及nfs 推荐开发者使用nfs 当使用ramdisk时, #gunzip k9.img.gz #mount –o loop k9.img /mnt/new_disk #umount /mnt/new_disk #gzip –c –v9 k9.img > k9.img.gz 这四条命令不要忘记,对于你来说多么强大 不要你去再建立根文件系统。 此外还有一篇关于二者区别的好文章:
http://www./forum/printthread.php?Cat=&Board=embedded&main=700811&type=post
我找了一块龙珠系列mx9328的板子和一个windriver
ice,于是想把上面跑起来linux,不过内核启动遇到一些,调试了1个星期,有点收获,准备记录下来,先把之前不明白的zImage和uImage差异写出来。 |
|