Chinaunix首页 | 论坛 | 博客
  • 博客访问: 232738
  • 博文数量: 29
  • 博客积分: 878
  • 博客等级: 上士
  • 技术积分: 1114
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-12 14:49
文章分类

全部博文(29)

文章存档

2012年(29)

分类: LINUX

2012-03-30 17:19:06

目前只知道编译内核时先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.o arch/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内核是如何启动的,下回再述。
阅读(7093) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~