linux内核makefile概览
前言:本博客参照内核官方英文文档
linux的内核makefile主要用于编译整个内核源码,按照用户的需求生成各种目标文件,对于用户来说,编译内核时非常简单的,只需要几个指令就可以做到,但是对于一个驱动开发者而言,了解内核源码的编译机制是非常必要的。
make 和 makefile
需要了解的是:make是linux下的一个程序软件,makefile相当于针对make程序的配置文件,当我们执行make命令时,make将会在当前目录寻找Makefile文件,然后根据Makefile的配置对源文件进行编译。
linux内核源代码的编译也是使用make工具和makefile,但是它在普通的C程序编译的基础上对配置和编译选项进行了扩展,这就是kbuild系统,专门针对linux的内核编译,使得linux内核的编译更加简洁而高效。
linux的内核镜像文件
首先我们需要认识一下linux内核镜像的各种形式,毕竟编译内核最主要的目的就是生成内核镜像,它有几种形式:vmlinux、vmlinux.bin、vmlinuz、zImage、bzImage。
vmlinux:这是编译linux内核直接生成的原始镜像文件,它是由静态链接之后生成的可执行文件,但是它一般不作为最终的镜像使用,不能直接boot启动,用于生成vmlinuz,可以debug的时候使用。
vmlinux.bin:与vmlinux相同,但采用可启动的原始二进制文件格式。丢弃所有符号和重定位信息。通过objcopy -O binary vmlinux vmlinux.bin从vmlinux生成。
vmlinuz:由vmlinux经过gzip(也可以是bzip)压缩而来,同时在vmlinux的基础上进一步添加了启动和解压缩代码,是可以引导boot启动内核的最终镜像。vmlinuz通常被放置在/boot目录,/boot目录下存放的是系统引导需要的文件,同时vmlinuz文件解压出的vmlinux不带符号表的目标文件,所以一般/boot目录下会带一个符号表System.map文件。
zImage:这是小内核的旧格式,有指令make zImage生成,仅适用于只有640K以下内存的linux kernel文件。
bzImage: big zImage,需要注意的是这个bz与bzip没有任何关系,适用于更大的linux kernel文件。现代处理器的linux镜像都是生成bzImage文件,同时,vmlinuz和bzImage是同一类型的文件,一般情况下这个和vmlinuz是同一个东西。
对于这一系列的生成文件可以参考官方文档
kbuild系统
各种各样的makeifle文件
在linux中,由于内核代码的分层模型,以及兼容很多平台的特性,makefile文件分布在各个目录中,对每个模块进行分离编译,降低耦合性,使编译方式更加灵活。
makefile主要是以下五个部分:
顶层makefile : 在源代码的根目录有个顶层makefile,顶层makefile的作用就是负责生成两个最重要的部分:编译生成vmlinux和各种模块。
.config文件 : 这个config文件主要是产生自用户对内核模块的配置,有三种配置方式:
编译进内核
编译成可加载模块
不进行编译。
arch/$(ARCH)/Makefile : 从目录可以看出,这个makefile主要是根据指定的平台对内核镜像进行相应的配置,提供平台信息给顶层makefile。
scirpts/makefile. : *这些makefile配置文件包含了构建内核的规则。
kbuild makefiles : 每一个模块都是单独被编译然后再链接的,所以这一种kbiuld makefile几乎在每个模块中都存在.在这些模块文件(子目录)中,也可以使用Kbuild文件代替Makefile,当两者同时存在时,优先选择Kbuild文件进行编译工作,只是用户习惯性地使用Makefile来命名。