分类: 嵌入式
2013-07-12 19:40:59
只是这个过程到底是怎么样的,内核如何实现这一系列复杂的链接编译。网上看了点资料,总结一下。
内核编译首先要生成的是vmlinux。这是一个ELF格式,非压缩的内核。他是如何得来的,在源码根目录下。vmlinux.cmd文件中可以查看到。
cmd_vmlinux := arm-linux-ld -EL -p --no-undefined -X --build-id -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o --start-group usr/built-in.o arch/arm/kernel/built-in.o arch/arm/mm/built-in.o arch/arm/common/built-in.o arch/arm/mach-s3c64xx/built-in.o arch/arm/plat-samsung/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o arch/arm/lib/lib.a lib/lib.a arch//lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o firmware/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o
可以看出vmlinux的生成依赖于arch/arm/kernel/head.o,arch//kernel/init_task.o,以及其他子目录下的built-in.o。至于底层还需要什么文件也可以按图索骥了。
vmlinux虽然已经是一个编译好的内核映像,但并不是最终烧写的映像,vmlinux需要通过-linux-objcopy转换,在对应体系结构下生成bin格式的映像文件Image。压缩映像由make zImage命令完成。最终生成zImage。
过程为:
1.用gzip对压缩内核二进制映象arch/arm/boot/ Image 进行压缩,生成arch//boot/compressed/piggy.gz 文件
2.在/arch//boot/conpressed目录下生成vmlinux
vmlinux把内含的内核符号表剥离,在arch//boot/compressed/vmlinux.bin,再将vmlinux.bin压缩成vmlinux.bin.gz,将vmlinux.scr和vmlinux.bin.gz链接成piggy.o,将head.o、misc.o和piggy.o链接成当前目录下的vmlinux,将vmlinux文件strip掉符号表得到arch/i386/boot/vmlinux.bin。
对应代码:
cmd_arch/arm/boot/compressed/vmlinux := arm-linux-ld -EL --defsym zreladdr=0x50008000 -p --no-undefined -X -T arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.gzip.o arch/arm/boot/compressed/misc.o arch/arm/boot/compressed/decompress.o arch/arm/boot/compressed/lib1funcs.o -o arch//boot/compressed/vmlinux
这是具备自解压功能的压缩内核,也是ELF格式。
3.用 arm-linux-objcopy 命令把 arch//boot/compressed/vmlinux 转换为二进制格式映象:
arch//boot/zImage
该目录下。zImage.cmd代码为
cmd_arch/arm/boot/zImage := arm-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S arch/arm/boot/compressed/vmlinux arch//boot/zImage
zImage为压缩了的可执行二进制文件。但在这个文件开头部分内嵌有gzip解压缩代码。linux内核启动时由bootloader把这个映像文件调入内存RAM中,执行完开头的解压缩部分后即可真正进入内核。