Linux内核配置之Kconfig 您所在的位置:网站首页 kconfig文件如何与驱动文件绑定 Linux内核配置之Kconfig

Linux内核配置之Kconfig

2024-02-26 11:42| 来源: 网络整理| 查看: 265

一、概述

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 0x1234int: 整型 该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" "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

在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有