学习目标:
了解Kconfig基本语法
学习内容:
既然要把Linux驱动编译到内核,那就得把目标驱动程序的配置项添加进编译要用到Kconfig文件。那我们大概了解一下Kconfig语法:
一、主菜单
支持主菜单的Kconfig文件就位于kernel的顶层目录下。打开Kconfig文件,可以看到第一个 关键字 mainmenu, mainmenu 是用来设置主菜单的标题的。文件内容如下:
可以看到上述命令是设置菜单的标题是:Linux/$(ARCH) $(KERNELVERSION) Kernel Configuration。可以看到这个标题里包含两个变量:ARCH 和 KERNELVERSION,注意一下,$(变量)是取变量的值,对于下图来说,$(ARCH)就是x86,$(KERNELVERSION)就是5.10.160。
我们再往下看支撑主菜单的Kconfig文件,第二个关键字出现了:source。source 用于读取另一个Kconfig文件,如: source "drivers/Kconfig"就是读取drivers目录下的Kconfig 文件。这就引入了一个选项,这个选项就是Device Drivers子菜单。
二、菜单结构
我们进入到drivers目录下。并打开对应的Kconfig文件,可以看到第三个关键字 menu,menu还有一个搭档endmenu,如下图:
可以看出menu/endmenu是用来生成菜单的,menu是菜单开始的标志,后面跟的"Device Drivers"就是子菜单的名称,endmenu是菜单结束的标志,这两个是成对出现的。那么看看产生的菜单长什么样:
这里面的<> []的作用可以看上一篇介绍。那这些括号在Kconfig文件中怎么体现?
三、配置选项
我们继续进入"Device Drivers" 菜单的子菜单 "Character devices",其对应的支持Kconfig在kernel/drivers/char 目录下:
由图可以看到第5个关键字:config,关键字config 用来定义一个新的选项。
每个选项都必须指定类型,类型包括bool,tristate,string,hex,int。选项后面一般跟着这个选项的名称。
最常见的是bool,tristate,string这三个。
- bool 类型有两种值:y 和 n。在图像界面里表项形式就是[]。
- tristate 有三种值:y,m 和 n。在图像界面里表项形式就是<>。
- string 为字符串类型。在图像界面里表项形式就是()。
四、帮助信息
接着看第6个关键字 help:不要在意没把depends on算第6个,它另有安排;help表示帮助信息,当我们在图形化界面按下h按键,弹出来的就是help的内容。以上图中第一个配置项为例,当按h时看下图:
五、依赖关系
现在看看第7个关键字 depends on,为什么刚才要跳过它呢?因为它会引出第8个关键字select,也是一个依赖关系关键字。这两个有啥不同呢?
- depends on 表示直接依赖关系:如下面例子中的TTY_PRINTK依赖于EXPERT && TTY
- select 表示反向依赖关系:表示AUDITSYSCALL被选中的情况下,FSNOTIFY会被自动选中。
六、可选选项
使用 choice/endchoice 定义可选择项。这是又一个成对出现的关键字。
六、注释
Kconfig中使用 comment 用于注释,这个注释是在图像化界面中显示的注释。