一、概述

Kconfig是按照特定的格式来书写的文件,menuconfig程序可以识别这种格式,然后从中提取出有效信息组成menuconfig中的菜单项。在修改内核配置或驱动移植时,需要在Kconfig文档中修改或添加一些内容。

经典 博文 网址

二、目录到导入和菜单的创建

2.1 内核源码顶层目录的Kconfig

#
# For a description of the syntax of this configuration file,
# see Documentation/kbuild/kconfig-language.txt.
#
mainmenu "Linux/$ARCH $KERNELVERSION Kernel Configuration"

config SRCARCH
	string
	option env="SRCARCH"

source "arch/$SRCARCH/Kconfig"

mainmenu: 主菜单 
语法格式:mainmenu "主菜单的名字"  如下图红线部分

source :引入下一级菜单
语法格式: source "下一级菜单的Kconfig的路径"  打开 arch/arm64/目录下的Kconfig文件

在这里插入图片描述

2.2 次一级目录的Kconfig

config ARM64
	def_bool y
	select ACPI_CCA_REQUIRED if ACPI
	select ACPI_GENERIC_GSI if ACPI
	select ACPI_REDUCED_HARDWARE_ONLY if ACPI
	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
	........
	help
	  ARM 64-bit (AArch64) Linux support.
config 64BIT
	def_bool y
	......
	config PGTABLE_LEVELS
	int
	default 2 if ARM64_16K_PAGES && ARM64_VA_BITS_36
	default 2 if ARM64_64K_PAGES && ARM64_VA_BITS_42
	default 3 if ARM64_64K_PAGES && ARM64_VA_BITS_48
	default 3 if ARM64_4K_PAGES && ARM64_VA_BITS_39
	default 3 if ARM64_16K_PAGES && ARM64_VA_BITS_47
	default 4 if !ARM64_64K_PAGES && ARM64_VA_BITS_48
source "init/Kconfig"
   ........
   menu "Bus support"
config PCI
	bool "PCI support"
	help
	  This feature enables support for PCI bus system. If you say Y
	  here, the kernel will include drivers and infrastructure code
	  to support PCI bus devices.
config PCI_DOMAINS
	def_bool PCI
config PCI_DOMAINS_GENERIC
	def_bool PCI
config PCI_SYSCALL
	def_bool PCI

source "drivers/pci/Kconfig"
source "drivers/pci/pcie/Kconfig"
source "drivers/pci/hotplug/Kconfig"
endmenu
menu "CPU Power Management"
source "drivers/cpuidle/Kconfig"
source "drivers/cpufreq/Kconfig"
endmenu
source "net/Kconfig"
source "drivers/Kconfig"
source "drivers/firmware/Kconfig"
source "drivers/acpi/Kconfig"
source "fs/Kconfig"
source "arch/arm64/kvm/Kconfig"
source "arch/arm64/Kconfig.debug"
source "security/Kconfig"
source "crypto/Kconfig"
if CRYPTO
source "arch/arm64/crypto/Kconfig"
endif
source "lib/Kconfig"	

menu…endmenu : 菜单
格式:
menu “菜单的名字”
菜单选项
source “下一级的菜单”
endmenu

如:
menu "CPU Power Management"
source "drivers/cpuidle/Kconfig"
source "drivers/cpufreq/Kconfig"
endmenu

在这里插入图片描述

三、语法结构

3.1 config 条目

每个菜单项都有一个关键字标识,最常见的就是config。

语法:

config     symbol
options

语法解释如下:
config   关键字  表示后面是菜单项
symbol   新的菜单项
options  菜单项下的属性和选项

例如:

config ARM64_ACPI_PARKING_PROTOCOL
	bool "Enable support for the ARM64 ACPI parking protocol"
	depends on ACPI
	help
	  Enable support for the ARM64 ACPI parking protocol. If disabled
	  the kernel will not allow booting through the ARM64 ACPI parking
	  protocol even if the corresponding data is present in the ACPI
	  MADT table.

其中options部分有:

1、类型定义:
每个config菜单项都要有类型定义,bool:布尔类型, tristate三态:内建、模块、移除, string:字符串, hex:十六进制, integer:整型

  • bool: 布尔类型 该CONFIG宏只能选择y(编译内核)或者n(不编译),菜单项前为圆括号
  • tristate: 三态 该CONFIG宏可以设置y/m/n三种模式即内建、模块、移除,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.
  • string: 字符串 该CONFIG宏可以设为一串字符,比如#define CONFIG_XXX “config test”
  • hex: 十六进制 该CONFIG宏可以设为一个十六进制,比如#define CONFIG_XXX 0x1234
  • int: 整型 该CONFIG宏可以设为一个整数,比如#define CONFIG_XXX 1234

2、依赖型定义depends on和select 指此菜单的出现是否依赖于另一个定义

  • depends on:依赖项,比如depends on XXX 表示当前宏需要CONFIG_ XXX宏打开的前提下,才能设置它
    (注意依赖项的config参数只有bool或tristate才有效)

  • select : 反依赖项,和depends on刚好相反,比如 selecton
    XXX表示当前宏如果是y或者m,则会自动设置XXX=y或者m(注意参数只有bool或tristate才有效)

3、帮助性定义
只是增加帮助用关键字help或—help—

3.2 menu条目

menu条目用于生成菜单,其格式如下:

menu "字符串"
 ..............
 endmenu

例如

menu "Userspace binary formats"
source "fs/Kconfig.binfmt"
config COMPAT  //  对应 .config  文件中 CONFIG_COMPAT=y    对应 生成的autoconf.h 文件中 #define CONFIG_COMPAT 1
	bool "Kernel support for 32-bit EL0"    //对应菜单项
	depends on ARM64_4K_PAGES || EXPERT
	select COMPAT_BINFMT_ELF if BINFMT_ELF
	select HAVE_UID16
	select OLD_SIGSUSPEND3
	select COMPAT_OLD_SIGACTION
	help
	  This option enables support for a 32-bit EL0 running under a 64-bit
	  kernel at EL1. AArch32-specific components such as system calls,
	  the user helper functions, VFP support and the ptrace interface are
	  handled appropriately by the kernel.

	  If you use a page size other than 4KB (i.e, 16KB or 64KB), please be aware
	  that you will only be able to execute AArch32 binaries that were compiled
	  with page size aligned segments.
	  If you want to execute 32-bit userspace applications, say Y.
config SYSVIPC_COMPAT
	def_bool y
	depends on COMPAT && SYSVIPC
config KEYS_COMPAT
	def_bool y
	depends on COMPAT && KEYS

endmenu

在这里插入图片描述

3.3 choice条目

会生成一个单选框,里面通过多选一方式选择config,需要注意choice中的config参数只能bool或tristate

choice条目将多个类似的配置选项组合在一起,供用户单选或多选

choices条目格式如下

   "choice"
   
   <choiceoptions>
   <choiceblock>
   
   "endchoice"

这个定义了一个选择集合,并且接受任何上面所说的属性作为选项。选择只能是bool类型或tristate类型,并且布尔选择只允许一个单一的配置项被选中,三态选择还允许任何配置项被设置为“M”。这可以用在下面的情况:如果一个硬件存在多个驱动程序,并且只有一个驱动程序​​可以编译/加载到内核中,但所有的驱动程序可以编译成模块。

一个choice接受另外一个选项“optional”,中允许将choice的值设为’n’,并且没有入口需要被选择。

choice
	prompt "Virtual address space size"
	default ARM64_VA_BITS_39 if ARM64_4K_PAGES
	default ARM64_VA_BITS_47 if ARM64_16K_PAGES
	default ARM64_VA_BITS_42 if ARM64_64K_PAGES
	help
	  Allows choosing one of multiple possible virtual address
	  space sizes. The level of translation table is determined by
	  a combination of page size and virtual address space size.

config ARM64_VA_BITS_36
	bool "36-bit" if EXPERT
	depends on ARM64_16K_PAGES

config ARM64_VA_BITS_39
	bool "39-bit"
	depends on ARM64_4K_PAGES

config ARM64_VA_BITS_42
	bool "42-bit"
	depends on ARM64_64K_PAGES

config ARM64_VA_BITS_47
	bool "47-bit"
	depends on ARM64_16K_PAGES

config ARM64_VA_BITS_48
	bool "48-bit"

endchoice

prompt “Virtual address space size” 给出提示信息“Virtual address space size”,光标选中回车进入就可以看到多个config条目定义的配置选项,choice条目中定义的变量只有bool和tristate。

在这里插入图片描述

3.4 comment条目

comment条目用于定义一些帮助信息,出现在界面的第一行,如在arch/arm/Kconifg中有如下代码:

menu “Floating point emulation”
comment “At least one emulation must be selected”
config FPE_NWFPE

config FPE_NWFPE_XP

3.5 source条目(上文有讲)

source条目用于读取另一个Kconfig文件,内核源码目录树中每一个Kconfig都会用source引入其所有子目录下的Kconfig,从而保证了所有的Kconfig项目都被包含进menuconfig中。这个也说明了:如果你自己在linux内核中添加了一个文件夹,一定要在这个文件夹下创建一个Kconfig文件,然后在这个文件夹的上一层目录的Kconfig中source引入这个文件夹下的Kconfig文件。如:

source "arch/$SRCARCH/Kconfig"

三、使用Kconfig时,需要注意的地方

1.在Kconfig中定义的配置宏,前缀都没有"CONFIG_",只有编译内核时,自动生成autoconf.h才会出现前缀.
2.如果XX_defconfig板卡配置文件中定义新的宏=y时,而在Kconfig并没有声明它,则内核编译出来的autoconf.h里也不会定义它的.
3.如果XX_defconfig板卡配置文件中没有设置CONFIG_MODULES=y,则编译make modules时将会失败,而make menuconfig时, Kconfig中的tristate参数也会被读写为bool参数(也就是不能设置m)

四、其它常用参数

default y:  表示默认是勾上的,当然也可以写为default m或者default n
prompt:     提示信息,如果对于choice而言,则会用来当做一个单选框入口点的标签
range :      设置用户输入的数据范围,比如range 0 100表示数据只能位于0~100
menuconfig: menuconfig XXX和config XXX类似,唯一不同的是该选项除了能设置y/m/n外,还可以实现菜单效果(能回车进入该项内部)

五、Kconfig以及Make menuconfig的关系

在这里插入图片描述
在这里插入图片描述

六、Kconfig与Makefile对照图示

在这里插入图片描述

七、大神的经典记录

示例1-创建复选框(多选多)-探索宏变量参数
接下来我们来试试如何给不同宏设置不同参数,以MY_SYMBOL1~ MY_SYMBOL5为例
设置MY_SYMBOL3~ MY_SYMBOL5依赖于MY_SYMBOL2
修改内核顶层Kconfig文件,添加内容:

menuconfig MY_SYMBOL_TEST    #生成一个菜单宏项
bool "MY_SYMBOL_TEST"
default y

config MY_SYMBOL1
bool "my symbol is bool"
default y
depends on MY_SYMBOL_TEST
config MY_SYMBOL2
tristate "my symbo2 is tristate"
default m
depends on MY_SYMBOL_TEST    

config MY_SYMBOL3
string "my symbo3 is string"
default "test symbo3"
depends on MY_SYMBOL2 && MY_SYMBOL_TEST

config MY_SYMBOL4
hex "my symbo4 is hex"
range 0 0x2000                  #设置hex区间
default 0x1234
depends on MY_SYMBOL2 && MY_SYMBOL_TEST

config MY_SYMBOL5
int "my symbo5 is int" 
range 0 2000                     #设置int区间
default 1234
depends on MY_SYMBOL2 && MY_SYMBOL_TEST

效果如下所示:

/home/ouler/下载/wine/1182576-20190119175736576-699057264.gif

在这里插入图片描述如上图所示,可以看到我们设置my symbol5超出区间[0,2000]时,直接数据报错

编译内核后,查看自动生成的autoconf.h,定义如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中上面的CONFIG_MY_SYMBOL2_MODULE宏是因为我们在Kconfig设置它为default m,所以CONFIG_MY_SYMBOL2_MODULE是个模块宏.
示例2-通过choice创建单选框(多选一)

choice
prompt "choice example"    #作为该单选框入口点的标签
default y
default MY_SYMBOL3         #默认选择MY_SYMBOL3配置项

config MY_SYMBOL1
bool "my symbol1 is bool"
help
MY_SYMBOL1 example

config MY_SYMBOL2
bool "my symbo2 is bool"
help
MY_SYMBOL2 example

config MY_SYMBOL3
tristate "my symbo3 is tristate"
help
MY_SYMBOL3 example

endchoice

编译内核后,查看autoconf.h,如下图所示,可以看到对于choice单选框来说,tristate属性其实并没有module功能,只有y/n

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐