目前只知道编译内核时先make menuconfig进行一些个性化的设置。然后执行make即可在内核源码根目录下得到ELF文件vmlinux,并且在相应体系结构arch/arm/boot目录下得到zImage可执行的压缩内核映像,进而烧写到开发板中。
只是这个过程到底是怎么样的,linux内核如何实现这一系列复杂的链接编译。网上看了点资料,总结一下。
内核编译首先要生成的是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/arm/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/arm/kernel/
init_task.o,
以及其他子目录下的built-in.o。至于底层还需要什么文件也可以按图索骥了。
vmlinux虽然已经是一个编译好的内核映像,但并不是最终烧写的映像,vmlinux需要通过arm-linux-
objcopy转换,在对应体系结构下生成bin格式的映像文件Image。压缩映像由make zImage命令完成。最终生成zImage。
过程为:
1.用gzip对压缩内核二进制映象arch/arm/boot/ Image 进行压缩,生成
arch/arm/boot/compressed/piggy.gz 文件
2.在/arch/arm/boot/conpressed目录下生成vmlinux
vmlinux把内含的内核符号表剥离,在
arch/arm/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.oarch/arm/boot/compressed/misc.o arch/arm/boot/compressed/decompress.o arch/arm/boot/compressed/lib1funcs.o -o arch/arm/boot/compressed/vmlinux
这是具备自解压功能的压缩内核,也是ELF格式。
3.
用 arm-linux-objcopy 命令把 arch/arm/boot/compressed/vmlinux 转换为二进制格式映象:
arch/arm/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/arm/boot/zImage
zImage为压缩了的可执行二进制文件。但在这个文件开头部分内嵌有gzip解压缩代码。linux内核启动时由bootloader把这个映像文件调入内存RAM中,执行完开头的解压缩部分后即可真正进入内核。
至于arm中linux内核是如何启动的,下回再述。