Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101579
  • 博文数量: 34
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 215
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-27 11:21
文章分类
文章存档

2014年(1)

2013年(33)

我的朋友

分类: 嵌入式

2013-07-12 19:40:59

前只知道编译内核时先make menuconfig进行一些个性化的设置。然后执行make即可在内核源码根目录下得到ELF文件vm,并且在相应体系结构arch//boot目录下得到zImage可执行的压缩内核映像,进而烧写到开发板中。

    只是这个过程到底是怎么样的,内核如何实现这一系列复杂的链接编译。网上看了点资料,总结一下。

    内核编译首先要生成的是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中,执行完开头的解压缩部分后即可真正进入内核。

阅读(1394) | 评论(0) | 转发(0) |
0

上一篇:linux各种栈

下一篇:printk是怎么干活的

给主人留下些什么吧!~~