读书笔记--menuconfig--Kconfig

时间:2021-07-25
本文章向大家介绍读书笔记--menuconfig--Kconfig,主要包括读书笔记--menuconfig--Kconfig使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

menuconfig和Kconfig和.config的关系:

  menuconfig显示的菜单内容(一方面是菜单的目录结构,另一方面是每一个菜单项目的细节)是由内核源码树各个目录下的Kconfig文件来支持的。

  Kconfig文件中按照一定的格式包含了一个又一个的配置项,每一个配置项在make menuconfig中都会成为一个菜单项目。而且menuconfig中显示的菜单目录结构和源码目录中的Kconfig的目录结构是一样的。

  在相应的Kconfig文件中删除一个config项,则再次make menuconfig时这个项目已经看不到了。

menuconfig读取/写入.config文件
  (1)刚才已经知道menuconfig的菜单内容来自于Kconfig文件,但是每一个菜单的选择结果(Y、N、M)却不是保存在Kconfig文件中的。Kconfig文件是不变的,Kconfig文件只是决定有没有这个菜单项,并不管这个菜单项的选择结果。
  (2)menuconfig工作时在我们make menuconfig打开时,他会读取.config文件,并且用.config文件中的配置选择结果来初始化menuconfig中各个菜单项的选择值。

  (3)当我们每次退出make menuconfig时,menuconfig机制会首先检查我们有没有更改某些配置项的值,如果我们本次没有更改过任意一个配置项目的值那直接退出;如果我们有改动配置项的值则会提示我们是否保存。此时如果点保存,则会将我们更改过的配置重新写入.config文件中记录,下一次再次打开make menuconfig时会再次加载.config,最终去编译内核时编译连接程序会考虑.config中的配置值指导整个编译连接过程。

Kconfig文件详解

1、Kconfig的格式:

  (1)Kconfig按照一定的格式来书写,menuconfig程序可以识别这种格式,然后从中提取出有效信息组成menuconfig中的菜单项。
  (2)将来在做驱动移植等工作时,有时需要自己添加Kconfig中的一个配置项来将某个设备驱动添加到内核的配置项目中,这时候就需要对Kconfig的配置项格式有所了解,否则就不会添加。

  (3)#开头的行是注释行
  (4)menuconfig 表示菜单(本身属于一个菜单中的项目,但是他又有子菜单项目)、config表示菜单中的一个配置项(本身并没有子菜单下的项目)。
  (5)menuconfig或者config后面空格隔开的大写字母表示的类似于 NETDEVICES 的就是这个配置项的配置项名字,这个字符串前面添加CONFIG_后就构成了.config中的配置项名字。
  (6)一个menuconfig后面跟着的所有config项就是这个menuconfig的子菜单。这就是Kconfig中表示的目录关系。
  (7)内核源码目录树中每一个Kconfig都会source引入其所有子目录下的Kconfig,从而保证了所有的Kconfig项目都被包含进menuconfig中。这个也告诉我们:如果你自己在linux内核中添加了一个文件夹,一定要在这个文件夹下创建一个Kconfig文件,然后在这个文件夹的上一层目录的Kconfig中source引入这个文件夹下的Kconfig文件。

2、tristate和bool的含义
  tristate意思是三态(3种状态,对应Y、N、M三种选择方式),对应于"<*> ",或者 “ <  >”,或者 “ < M >” 。

  bool是要么真要么假(对应Y和N),对应于" [ * ] ",或者 “ [  ]” 。

3、depends的含义

  (1)depends中文意思是“取决于”或者“依赖于”,所以depends在这里的意思是:本配置项依赖于另一个配置项。如果那个依赖的配置项为Y或者M,则本配置项才有意义;如果依赖的哪个配置项本身被设置为N,则本配置项根本没有意义。
  (2)depends项目会导致make menuconfig的时候找不到一些配置项。所以你在menuconfig中如果找不到一个选项,但是这个选项在Kconfig中却是有的,则可能的原因就是这个配置项依赖的一个配置项是不成立的。
  (3)depends并不要求依赖的配置项一定是一个,可以是多个,而且还可以有逻辑运算。这种时候只要依赖项目运算式子的裸机结果为真则依赖就成立。

 1 #
 2 # Network device configuration
 3 #
 4 
 5 menuconfig NETDEVICES
 6     default y if UML
 7     depends on NET
 8     bool "Network device support"
 9     ---help---
10       You can say N here if you don't intend to connect your Linux box to
11       any other computer at all.
12 
13       You'll have to say Y if your computer contains a network card that
14       you want to use under Linux. If you are going to run SLIP or PPP over
15       telephone line or null modem cable you need say Y here. Connecting
16       two machines with parallel ports using PLIP needs this, as well as
17       AX.25/KISS for sending Internet traffic over amateur radio links.
18 
19       See also "The Linux Network Administrator's Guide" by Olaf Kirch and
20       Terry Dawson. Available at <http://www.tldp.org/guides.html>.
21 
22       If unsure, say Y.
23 
24 # All the following symbols are dependent on NETDEVICES - do not repeat
25 # that for each of the symbols.
26 if NETDEVICES
config DM9000
    tristate "DM9000 support"
    depends on ARM || BLACKFIN || MIPS
    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.

config DM9000_16BIT
    bool "DM9000 16-bit"
    depends on DM9000
    default n
    help
      Support DM9000 ethernet controller with 16bit data bus

Kconfig和.config文件和Makefile三者的关联
(1)配置项被配置成Y、N、M会影响.config文件中的CONFIG_XXX变量的配置值。
(2)这个.config中的配置值(=y、=m、没有)会影响最终的编译链接过程。如果=y则会被编入(built-in),如果=m会被单独连接成一个ko模块,如果没有则对应的代码不会被编译。那么这么是怎么实现的?都是通过makefile实现的。
(3)obj-$(CONFIG_DM9000) += dm9000.o
如果CONFIG_DM9000变量值为y,则obj += dm9000.o,因此dm9000.c会被编译;如果CONFIG_DM9000变量未定义,则dm9000.c不会被编译。如果CONFIG_DM9000变量的值为m则会被连接成ko模块(这个是在linux内核的Makefile中定义的规则)

总结:把menuconfig中的菜单项、Kconfig中的配置项、.config中的一行、 Makefile中的一行,这4个东西结合起来理解,则整个linux内核的配置体系就明了了。

原文地址:https://www.cnblogs.com/ben002/p/15057264.html