本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1) Linux内核配置 <h1>
Kconfig,顾名思义就是 Linux内核的配置(Kernel config)。在编译内核之前需要配置,需要哪些东西(也就是支持哪些东西)就配置它,让内核支持它。从内核源码的角度来看的话,内核源码中出现了很多“判断语句”(条件指示符),这样就会出现“动态编译”。内核依靠配置文件(.config)把“条件指示符”所包含的内容编译进内核。
总结:配置主要从两个方面出发
①从Makefile的角度
-
静态编进内核(直接编进内核)
-
动态编进内核(做为模块编进内核)
-
在/include/config目录下自动生成auto.conf 给顶层Makefile使用
在 include/config/auto.conf中可以看到类似于下图这样的配置选项,这是提供给顶层Makefile使用的。
②从内核源码的角度
“条件指示符”所指示的"代码"到底需不需要被编进内核。在include/linux目录下自动生成了autoconf.h这个头文件 。在autoconf.h中可以看到类似于这样的配置选项,这是提供给Linux源码使用。
```
#define CONFIG_CPU_S3C2410_DMA 1
#define CONFIG_CRYPTO_ECB_MODULE 1
#define CONFIG_SMDK2440_CPU2440 1
#define CONFIG_KGDB_PORT_NUM 0
#define CONFIG_SERIAL_8250_SHARE_IRQ 1
```
构建内核的第一步始终是配置。Kconfig有助于使Linux内核高度模块化和可定制。Kconfig为用户提供了许多配置目标:
2) Linux内核构建 <h1>
Linux 内核采用统一的代码基础,却可以在大到服务器,小到微型的嵌入式设备上使用,其高度可裁剪、可定制化的构建在业界都是一流的。Linux 在 2.6 版本之后采取了 Kbuild 系统(the Linux Kernel Build System)进行系统的配置和构建。在新的构建系统下,首先编译系统会读取 Linux 内核顶层的 Makefile,然后根据读到的内容第二次读取 Kbuild Makefile 来编译内核。Linux Kernel 采用 Kconfig 和 Kbuild用于辅助内核的配置和编译。Kbuild 系统需要与 Kconfig 配合使用。
组件式构建(称为递归make)是GNU make管理大型项目的常用方法。Kbuild是递归make的一个很好的例子。通过将源文件划分为不同的模块/组件,每个组件都由其自己的makefile管理。顶级makefile以正确的顺序调用每个组件的makefile,构建组件,并将它们收集到最终的执行程序中。
Kbuild指的是不同类型的makefile,makefile主要是以下五个部分:
- 顶层Makefile:在源代码的根目录有个顶层Makefile,顶层Makefile的作用就是负责生成两个最重要的部分:编译生成vmlinux和各种模块。
- .config文件:这个config文件主要是产生自用户对内核模块的配置,有三种配置方式:编译进内核、编译成可加载模块、不进行编译。
- arch/$(ARCH)/Makefile:从目录可以看出,这个 Makefile 主要是根据指定的平台对内核镜像进行相应的配置,提供平台信息给顶层 Makefile。
- scirpts/Makefile.:这些 Makefile 配置文件包含了构建内核的规则。
- kbuild Makefiles:每一个模块都是单独被编译然后再链接的,所以这一种 kbiuld Makefile几乎在每个模块中都存在.在这些模块文件(子目录)中,也可以使用 Kbuild 文件代替 Makefile,当两者同时存在时,优先选择 Kbuild 文件进行编译工作,只是用户习惯性地使用 Makefile 来命名。
top makefile包含arch makefile,读取.config文件,下载到子目录,在scripts / Makefile。*中定义的例程的帮助下,在每个组件的makefile上调用make,构建每个中间对象,并将所有中间对象链接到vmlinux中。