写在前头
*.版权声明:本篇文章为原创,可随意转载,转载请注明出处,谢谢!另我创建一个QQ群82642304,欢迎加入!
*.目的:整理一下RIotBoard开发板的启动流程,对自己的所学做一个整理总结,本系列内核代码基于linux-3.0.35-imx。
*.备注:整个系列只是对我所学进行总结,记录我认为是关键的点,另我能力有限,难免出现疏漏错误,如果读者有发现请多指正,以免我误导他人!
从编译说起
linux内核的常见操作就是配置和编译.
make config、make menuconfig、make xxx_defconfig等等都是对内核的配置,生成的配置文件在顶层目录的.config。其中make menuconfig和make xxx_defconfig是比较常用的。一般刚开始的时候都是需要默认配置文件,比如我的RIotBoard的板子就是make imx6_defconfig实际上就是将arch/arm/configs/imx6_defconfig拷贝到.config。
make vmlinux、make bzImage、make uImage等等实际上就是将内核编译成一个可执行的文件,对于Uboot来说,我们是用make uImage进行编译的,uImage是在编译出来的内核文件前端加上一个镜像头,供Uboot进行识别。
内核编译实际上是一个比较庞大的工程,而且输出也相对精简,但是我们在make的时候加上V=1,就可以输出详细的信息。
uImage生成流程
- 根据内核配置文件,将linux中的子系统编译成一个个build-in.o
- 将所有的build-in.o链接生成vmlinx,使用的链接脚本为arch/arm/kernel/vmlinux.lds
- 将生成的vmlinux通过arm-fsl-linux-gnueabi-objcopy去掉符号表,调试信息等,生成arch/arm/boot/Image
- 将生成的arch/arm/boot/Image通过gzip压缩成arch/arm/boot/compressed/piggy.gzip
- 根据链接脚本arch/boot/compressed/vmlinux.lds,将piggy.gzip和arch/boot/compressed里的自解压程序链接成arch/arm/boot/compressed/vmlinux。
- 将生成的vmlinux通过arm-fsl-linux-gnueabi-objcopy去掉符号表,调试信息等,生成arch/arm/boot/zImage
- 通过Uboot目录下的tools/mkimage程序,在arch/arm/boot/zImage的头部加上linux内核镜像头,生成arch/arm/boot/uImage
在uImage的生成流程中,用到里两个vmlinux.lds,生成里两次vmlinux。在2中生成的vmlinux是linux内核原始的执行镜像文件,在5中生成的vmlinux是先将linux内核原始的执行镜像文件压缩,然后编译自解压程序,最后将自解压程序和压缩后的文件链接成新的vmlinux,自解压程序在linux启动的时候先会被执行,它的作用就是解压缩内核镜像文件到指定地点,然后跳转到内核入口。
所以真正的入口是在arch/boot/compressed/中
总结
了解uImage的生成流程对研究linux内核启动流程还是有帮助的,如果懒于研究内核的Makefile和Kbuild机制,那就在make的时候加上V=1吧,它能够让你看清整个编译流程。
参考
暂无