Linux内核配置和编译原理 & menuconfigMakefile.config三者之间的关系

Posted 代二毛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内核配置和编译原理 & menuconfigMakefile.config三者之间的关系相关的知识,希望对你有一定的参考价值。

1、内核的配置体系

内核是高度可裁剪的,开发产品时根据产品的需求将无用的模块裁剪掉,也就是不要编译进内核,这样编译出来的内核体积小,节省内存,还可以节省性能。由此就需要条件编译,但是内核的可选编译模块太多了,必须要用一套编译体系来管理。我们可以这样类比来理解为什么内核需要一套编译体系来进行配置:当工程只有一个a.c,我们可以直接"gcc a.c"进行编译,但是有1000个源文件,用这种方法就不可行了,于是我们用Makefile进行编译;Makefile可以通过条件编译来让同一份代码在不同的平台上运行,假设代码编译的条件只用选两个平台(arm和下x86),我们可以"make plat=arm"或者"make plat=x86",那如果要条件编译的选项有上千个,同样的这样手工选择的方法也不可行,于是发明了一套编译体系来实现条件编译。总结:工程要管理的源文件太多,发明了Makefile;内核的Makefile要实现的条件编译太多,发明了一套编译体系;内核的配置体系由:Makefile、menuconfig、.config三部分构成。

2、内核配置和编译步骤

(1)确认Makefile:确认ARCH变量,比如ARCH=arm,表示编译ARM平台的内核,这个根据你用的soc选择;检查交叉编译工具链有没有设置对。如:CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
(2)make xxxx_defconfig:执行该语句后出现:configuration written to .config这句话就成功了。xxxx_defconfig是配置文件,指导编译内核,根据自己的硬件平台去选择,这句指令的作用就是生成.config文件,相当于"cp arch/xxx/configs/xxx_defconfig ./config",xxxx_defconfig是放在arch/平台名/configs下的。
(3)make menuconfig:会出现图形化的界面,可以在此界面配置内核,加载或者去除掉某些模块。
执行menuconfig可能出错的原因:屏幕太小,显示不了。解决方法就是全屏或者把字体调小;ncurses库没装,会有相关报错信息;

3、".config"文件

.config文件是一个隐藏文件,要用"ls -a"才能看见,默认是没有这个文件的,需要执行配置命令(make xxxx_defconfig)后才会生成。.config文件最初就是由xxxx_defconfig文件复制得来,里面全是配置项,以行为单位。每个配置项的格式都是CONFIG_xxx=x,每个配置项都可以在menuconfig中找到。CONFIG_xxx是配置项的名字,该配置项在menuconfig中的名字就是xxx,等号后面是配置的结果,可以是Y、N、M,Y代表编译连接此模块,N代表不编译此模块,M代表将该模块单独编译成.ko文件。
总结:.config文件最初由xxxx_defconfig文件复制得来,然后可以在menuconfig中做修改,最终Makefile会读取.config文件,里面的每个配置项都会指导内核的编译。

4、menuconfig详解

参考博客《Linux内核配置——menuconfig》

5、Kconfig文件

参考博客《Linux内核配置——Kconfig文件》

6、menuconfig、Makefile、.config三者之间的关系

6.1、Kconfig文件内容

config DM9000
	tristate "DM9000 support"
	depends on ARM || BLACKFIN || MIPS
	default y
	select CRC32
	select MII
	---help---
	  Support for DM9000 chipset.

	  To compile this driver as a module, choose M here.  The module
	  will be called dm9000.

6.2、.config文件

6.3、对应在menuconfig中

6.4、文件之间关系的解读

通过以网卡芯片DM9000的配置为例,讲解几个文件之间的联系。
(1).config文件默认在内核源码中是没有的,要先执行"make xxxx_defconfig"生成.config文件,这是对内核的初步配置。其中DM9000对应的名字是CONFIG_DM9000,等号后面的对DM9000的配置选项;
(2)执行"make menuconfig",在menuconfig会读取.config和Kconfig,在menuconfig中可以找到DM9000配置项,可以再次选择;
(3)Kconfig中DM900的内容是.config和menuconfig内容的来源,仔细对比DM9000在三个文件中的名字,可以发现关联;
(4)关闭menuconfig后,会把改变过的选项写会到.config中;
(5)Makefile中,会去.config中读取每项配置,其中就包括CONFIG_DM9000,如果CONFIG_DM9000=y则将编译进内核,如果CONFIG_DM9000=n则不会编译,如果CONFIG_DM9000=m则单独编译成.ko文件;

以上是关于Linux内核配置和编译原理 & menuconfigMakefile.config三者之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

内核的配置和编译原理

linux编译配置好的内核,编译镜像时候出现arm-linux-:命令未找到

如何编译安装Linux内核

Linux内核BPF的简单工作原理

Linux内核及分析 第五周 扒开系统调用的三层皮(下)

ubuntu内核编译问题