I want to be a complete engineer - technical genius and sensitive humanist all in one!

Wednesday, September 3, 2008

vmlinux、vmlinuxz、zImage概念解析

vmlinux 是ELF文件,即编译出来的最原始的文件。

从下面的内核编译过程,可以看出vmlinux, arch/arm/boot/compressed/vmlinux, arch/arm/boot/Image, arch/arm/boot/zImage 之间的区别

LD vmlinux
SYSMAP System.map
SYSMAP .tmp_System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gz
AS arch/arm/boot/compressed/piggy.o
CC arch/arm/boot/compressed/misc.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-2.6.26
Created: Thu Sep 4 15:24:35 2008
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1365684 Bytes = 1333.68 kB = 1.30 MB
Load Address: 0x80008000
Entry Point: 0x80008000
Image arch/arm/boot/uImage is ready

vmlinux 是一个elf格式的文件
Image 是经过objcopy 处理了的只包含内核代码,数据的一个文件, 已经不是elf格式的了。此时还没有经过压缩arch/arm/boot/compressed/vmlinux 是经过压缩的Image和加入了解压头的elf格式的文件
arch/arm/boot/zImage 是经过objcopy处理了的可以直接下到对应的地址执行的内核镜像。

objcopy:

GNU实用工具程序objcopy的作用是拷贝一个目标文件的内容到另一个目标文件中。 Objcopy使用GNU BFD库去读或写目标文件。Objcopy可以使用不同于源目标文件的格式来写目的目标文件(也即是说可以将一种格式的目标文件转换成另一种格式的目标文 件)。通过以上命令行选项可以控制Objcopy的具体操作。

Objcopy在进行目标文件的转换时,将生成一个临时文件,转换完成后就将这个临时文件删 掉。Objcopy使用BFD做转换工作。如果没有明确地格式要求,则Objcopy将访问所有在BFD库中已经描述了的并且它可以识别的格式,请参见 《GNUpro Decelopment Tools》中“using ld”一章中“BFD库”部分和“BFD库中规范的目标文件格式”部分。

通过使用srec作为输出目标(使用命令行选项-o srec),Objcopy可以产生S记录格式文件。

通过使用binary作为输出目标(使用命令行选项-o binary),Objcopy可以产生原始的二进制文件。使用Objcopy产生一个原始的二进制文件,实质上是进行了一回输入目标文件内容的内存转 储。所有的符号和重定位信息都将被丢弃。内存转储起始于输入目标文件中那些将要拷贝到输出目标文件去的部分的最小虚地址处。

使用Objcopy生成S记录格式文件或者原始的二进制文件的过程中,-S选项和-R选项可能会比较有用。-S选项是用来删掉包含调试信息的部分,-R选项是用来删掉包含了二进制文件不需要的内容的那些部分。

vmlinuz应该是由ELF文件vmlinux经过OBJCOPY后,并经过压缩后的文件。
zImage是vmlinuz经过gzip压缩后的文件 。
bzImage是vmlinuz经过bzip压缩后的文件。

碰到一条命令

mkfs.jffs2 -r ./rootfs -o fs.jffs2 -e0x40000 -p0x100000 ,需要了解一下。

对解压到内存时指定位置的问题,有了一些认识

vmlinux是位置相关的,解压zimage的时候,要把vmlinux放到指定的位置去。

加载地址 = __pa(0xc0008000)。

zImage会自己判断,放到合适的位置。

zImage是位置无关的,就是加载的内存的任何位置都可以。

vmlinux不是压缩的。

vmlinux.lds.S 里面可以指定地址,是链接脚本,指定的是虚拟地址,物理地址就要看__pa的定义了。

No comments:

Labels

Followers