linux 内核源码的管理是非常科学的,在linux内核源码的顶层目录下,分配了相应的目录,在对应目录下,代表一些功能或者属性的集群,这样就实现了模块化,便于管理。比如arch目录与平台架构相关,include目录存放着大量的内核头文件,drivers目录存放着各种驱动代码,比如显卡、网卡、USB总线、PCI总线等;kernel目录存放着支持体系结构特有的诸如信号量处理和SMP之类特征的实现,mm目录存放着体系结构特有的内存管理程序,然而在各个子目录下,又会进行细分。比如arch目录就存在和X86架构相关的目录X86和ARM架构相关的目录arm,与MIPS目录相关的目录mips等等。
对于一棵非标准树,还是有办法将其遍历的,只是算法比较复杂。在Linux源码的这棵树,就是通过Kconfig文件建立各层子目录之间的连接,通过Makefile文件来选择各个目录下的对应的文件是否被编译,而.config文件就像作为控制总台控制着Makefile文件去编译指定的长须代码文件(主要是c和汇编),而这一切控制关系是由Kconfig文件建立起来的。
Linux---kconfig文件的简述
内核源码树目录下都有两个文件Kconfug和makefile。分布到各个目录的kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make menuconfig,从Kconfig读出菜单用户选择后保存到.config的内核配置文件中。
从以上可以得出,Kconfig就是对应着内核的配置菜单。如果想要添加新的驱动到内核源码中,可以修改Kconfig,这样就可以选择这个旭东,如果想使这个驱动被编译,要修改makefile。
Kconfig的格式简介
Kconfig按照一定格式来写,menuconfig程序可以识别这种格式,然后从中提取有效信息,组成menuconfig中的菜单项。menuconfig表示菜单(本身属于一个菜单中的项目,但是它又有子菜单项目)。config表示菜单中的一个配置项(本身并没有子菜单下的项目)。一个menuconfig后面跟着所有config项就是这个menuconfig的子菜单,这就是Kconfig表示的目录关系。
NETDEVICES:menuconfig或者config后面空格隔开的大写字母表示的类似于NETDEVICES的就是这个配置项配置项名称,这个字符串前面添加CONFIG_就构成".config”文件中配置项的名字。
source:内核源码目录中每一个Kconfig都会用Kconfigsource引入其所有子目录下的Kconfig,从而保证所有的Kconfig都被包含进menuconfig中。这也就说明,如果你在Linux内核中添加了一个文件夹,一定要在这个文件夹下面创建一个kconfig文件,然后在这个文件夹的上一层目录的Kconfig文件中用source引入转让工人文件夹中的Kconfig文件。
tristate:意思是三态(三种状态,Y,N,M三种选择方式),意思是这个配置项可以被三种选择。
bool:要么真要么假(对应Y和N),意思是这个配置项只能被两种选择。
depends:意思是本配置项依赖于另一个配置项,如果这个配置项为Y或者M,则本配置项才有意义,如果依赖的哪个配置项本身被设置成N,则本配置根本没有意义。
depends项会导致make menuconfig的时候找不到找不到一些配置项,所以如果在menuconfig中如果找不到一个选项,但是这个选项在kconfig中却是有的,则可能这配置项依赖的一个配置项是不成立。
select:表示depends on 的值有效时,下面的select也会成立,将相应的选项选上。
default:表示depends on的值有效时,下面的default也会成立,将相应的选项选上,有三种选项,分别对应于y,n,m。
n:表示默认不编译。
y:表示默认编译进内核。
m:表示默认编译为模块。