7.2.3 Linux内核的生成
Linux内核默认编译的方式如下所示:
$ makeARCH=CROSS_COMPILE=
编译开始之后,将通过各个目录中的Makefile结合各个CONFIG_*配置选项对各个文件进行编译,生成各个.o文件,然后目录中的各个目标文件将被连接,之后生成名称为built-in.o的文件。编译的过程也会产生一些自动生成的头文件,如:include/linux/version.h表示内核的版本。
LD vmlinux
SYSMAP System.map
SYSMAP .tmp_System.map
MODPOST vmlinux
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
SHIPPED arch/arm/boot/compressed/lib1funcs.S
AS arch/arm/boot/compressed/lib1funcs.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
提示:内核编译过程中显示的CC、LD、AS等命令表示都是调用了交叉工具,而HOSTCC等则是调用主机本身的工具。
内核生成的几个文件在根目录、arch/arm/boot/目录和arch/arm/boot/compressed/目录中:
vmlinux.o是连接后内核的目标文件。
vmlinux(根目录)是ELF格式的内核。
System.map是内核的符号表。
Image是二进制的内核文件,由vmlinux转换而成。
vmlinux(compressed目录压缩)是经过压缩的vmlinux映像(通过gzip 算法压缩)和解压缩程序的组合体,也是ELF格式。
zImage是解压缩程序和压缩内核的结合。
内核编译后,也会生成相关的模块,模块以ko为后缀名。模块不是内核映像的一部分。
在键入make的时候可以增加一个目标为参数。
zImage:表示生成内核。
modules:表示生成各种内核模块。
uImage:表示生成要通过U-Boot启动的内核。
如果需要生成uImage,则需要系统中具有mkimage工具,这个工具的格式如下所示:
$ mkimage
Usage: mkimage -l image
-l==>list image header information
mkimage [-x] -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)
uImage常常从zImage生成,通常是在uImage上增加一个64字节(0x40)的头信息。描述这个内核的版本、加载位置、生成时间、大小等信息。
利用mkimage在命令行直接生成zImage的一个命令如下所示:
$ mkimage -n 'linux-2.6.35' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -n "S3C2440" -d zImage uImage
其中最重要的是由-a指定的加载地址和由-e指定的运行地址,它们需要与内核的编译信息的相符合。
【责任编辑:book TEL:(010)68476606】
点赞 0