linux内核中Kconfig文档的作用以及Kconfig的语法
- 格式:doc
- 大小:17.31 KB
- 文档页数:13
Linux系统的Makefile、Kconfig和模块1Makefile1.1Makefile组织层次Linux的Make体系由如下几部分组成:Ø顶层Makefile顶层Makefile通过读取配置文件,递归编译内核代码树的相关目录,从而产生两个重要的目标文件:vmlinux和模块。
Ø内核相关Makefile位于arch/$(ARCH) 目录下,为顶层Makefile提供与具体硬件体系结构相关的信息。
Ø公共编译规则定义文件。
包括Makefile.build 、Makefile.clean、Makefile.lib、Makefile.host等文件组成。
这些文件位于scripts目录中,定义了编译需要的公共的规则和定义。
Ø内核配置文件 .config通过调用make menuconfig或者make xconfig命令,用户可以选择需要的配置来生成期望的目标文件。
Ø其他Makefile主要为整个Makefile体系提供各自模块的目标文件定义,上层Makefile根据它所定义的目标来完成各自模块的编译。
1.2Makefile的使用在编译内核之前,用户必须首先完成必要的配置。
Linux内核提供了数不胜数的功能,支持众多的硬件体系结构,这就需要用户对将要生成的内核进行裁减。
内核提供了多种不同的工具来简化内核的配置。
make config,字符界面下命令行工具,这个工具会依次遍历内核所有的配置项,要求用户进行逐项的选择配置。
这个工具会耗费用户太多时间,除非万不得以(你的编译主机不支持其他配置工具)一般不建议使用。
make menuconfig,基于ncurse库编制的图形界面工具,一般台式机使用该工具。
make xconfig,基于X11的图形配置工具,一般用于工作站环境。
当用户完成配置后,配置工具会自动生成.config文件,它被保存在内核代码树的根目录下。
kconfig语法详解
在Linux内核配置中,kconfig是一个非常重要的工具。
它提供了一种灵活的方式来定义和配置内核参数。
kconfig语法是内核配置的核心,了解其语法规则和特性对于正确配置内核至关重要。
kconfig语法基于一个简单的配置文件格式,该文件描述了内核选项及其属性。
配置文件通常位于内核源码的顶层目录下,名为.config。
当内核源码被编译时,kconfig工具会读取这个文件,并根据其中的设置来构建内核映像。
kconfig语法的基本结构由配置节点、属性和值组成。
每个配置节点表示一个可配置的选项,而属性描述了该选项的特性和行为。
属性通常包括类型(如bool、int、string等)、默认值、描述和其他元数据。
下面是一个简单的kconfig语法示例:
在上面的示例中,config关键字用于声明一个配置节点。
节点的名称是MY_OPTION,类型为bool(布尔类型),默认值为y(表示启用)。
节点还有一个描述,说明这是一个示例选项。
kconfig语法的关键部分还包括条件语句、菜单结构、选择列表等。
这些高级特性使得配置过程更加灵活和复杂。
例如,可以使用条件语句来根据不同的配置环境或条件启用或禁用特定选项。
菜单结构允许用户在配置界面中组织选项,使界面更易于导航和理解。
选择列表则提供了一个用户可以选择的固定选项集合,通常用于设置某些特定的参数值。
总之,了解kconfig语法是进行Linux内核配置的基础。
通过掌握其基本结构和规则,用户可以更加灵活地定制和优化内核参数,以满足特定的需求和场景。
Linux内核中的Kconfig文件本节不对内核的Kconfig文件进行深入展开,更多Kconfig语法和说明请阅读<Documentation/kbuild/kconfig-language.txt>和<Documentation/kbuild/kconfig.txt>。
内核源码树每个目录下都还包含一个Kconfig文件,用于描述所在目录源代码相关的内核配置菜单,各个目录的Kconfig文件构成了一个分布式的内核配置数据库。
通过make menuconfig(make xconfig或者make gconfig)命令配置内核的时候,从Kconfig文件读取菜单,配置完毕保存到文件名为.config的内核配置文件中,供Makefile文件在编译内核时使用。
1.1.1 Kconfig基本语法如程序清单0.1所示代码摘自<drivers/char/Kconfig>文件,是一个比较典型的Kconfig文件片段,包含了Kconfig的基本语法。
程序清单0.1drivers/char/Kconfig片段menu "Character devices"source "drivers/tty/Kconfig"config DEVKMEMbool "/dev/kmem virtual device support"default yhelpSay Y here if you want to support the /dev/kmem device. The/dev/kmem device is rarely used, but can be used for certainkind of kernel debugging operations.When in doubt, say "N".……endmenu1.子菜单通过menu和endmenu来定义一个子菜单,程序清单0.1所示代码定义了一个“Character devices”子菜单,子菜单在界面中用“--->”表示,如图0.1所示。
Kconfig基本语法Linux 内核在2.6版本以后将配置⽂件由原来的config.in改为Kconfig。
当执⾏make menuconfig时会出现内核的配置界⾯,所有配置⼯具都是通过读取arch/$(ARCH)Kconfig⽂件来⽣成配置界⾯,这个⽂件就是所有配置的总⼊⼝,它会包含其他⽬录的Kconfig。
Kconfig的作⽤是⽤来配置内核,它就是各种配置界⾯的源⽂件,内核的配置⼯具读取各个Kconfig⽂件,⽣成配置界⾯供开发⼈员配置内核,最后⽣成配置⽂件.config。
Kconfig的语法可以参考Documentation/kbuild/kconfig-language.txt,在这⾥给出kconfig-language.txt的中⽂翻译。
介绍----在配置数据库的配置选项是以树的形式组织的:+- Code maturity level options| +- Prompt for development and/or incomplete code/drivers+- General setup| +- Networking support| +- System V IPC| +- BSD Process Accounting| +- Sysctl support+- Loadable module support| +- Enable loadable module support| +- Set version information on all module symbols| +- Kernel module loader+- ...每个选项都有其⾃⼰的依赖关系。
这些依赖关系决定了选项是否是可见的。
⽗选项可见,⼦选项才能可见。
菜单选项--------⼤多数的选项都定义了⼀个配置选项,其它选项则有助于对它们进⾏组织。
⼀个配置选项定义可以是下⾯的形式:config MODVERSIONSbool "Set version information on all module symbols"depends MODULEShelpUsually, modules have to be recompiled whenever you switch to a newkernel. ...每⾏都是以config关键字开始,并可以接多个参数。
LINUX设备驱动开发详解概述LINUX设备驱动开发是一项非常重要的任务,它使得硬件设备能够与操作系统进行有效地交互。
本文将详细介绍LINUX设备驱动开发的基本概念、流程和常用工具,帮助读者了解设备驱动开发的要点和技巧。
设备驱动的基本概念设备驱动是连接硬件设备和操作系统的桥梁,它负责处理硬件设备的输入和输出,并提供相应的接口供操作系统调用。
设备驱动一般由设备驱动程序和设备配置信息组成。
设备驱动程序是编写解决设备驱动的代码,它负责完成设备初始化、IO操作、中断处理、设备状态管理等任务。
设备驱动程序一般由C语言编写,使用Linux内核提供的API函数进行开发。
设备配置信息是定义硬件设备的相关参数和寄存器配置的文件,它告诉操作系统如何与硬件设备进行交互。
设备配置信息一般以设备树或者直接编码在设备驱动程序中。
设备驱动的开发流程设备驱动的开发流程包括设备初始化、设备注册、设备操作函数编写和设备驱动注册等几个主要步骤。
下面将详细介绍这些步骤。
设备初始化设备初始化是设备驱动开发的第一步,它包括硬件初始化和内存分配两个主要任务。
硬件初始化是对硬件设备进行基本的初始化工作,包括寄存器配置、中断初始化等。
通过操作设备的寄存器,将设备设置为所需的状态。
内存分配是为设备驱动程序分配内存空间以便于执行。
在设备初始化阶段,通常需要为设备驱动程序分配一块连续的物理内存空间。
设备注册设备注册是将设备驱动程序与设备对象进行关联的过程,它使得操作系统能够正确地管理设备。
设备注册包括设备号分配、设备文件创建等操作。
设备号是设备在系统中的唯一标识符,通过设备号可以找到设备对象对应的设备驱动程序。
设备号分配通常由操作系统负责,设备驱动程序通过注册函数来获取设备号。
设备文件是用户通过应用程序访问设备的接口,它是操作系统中的一个特殊文件。
设备文件的创建需要通过设备号和驱动程序的注册函数来完成。
设备操作函数编写设备操作函数是设备驱动程序的核心部分,它包括设备打开、设备关闭、读和写等操作。
config用法config是一个常用的配置文件格式,它是一种文本文件,通常以.config为扩展名。
config文件用于存储应用程序的配置信息,包括设置、选项、参数等。
在计算机应用中,config文件通常用于设置应用程序的运行参数、文件路径、端口号、数据库连接信息等。
通过使用config文件,用户可以方便地修改应用程序的配置,从而满足不同的使用场景和需求。
一、config文件的结构config文件通常包含多个配置项,每个配置项由键值对组成。
键是配置项的名称,值是对应的值。
config文件可以包含多个层次结构,每个层次结构由多个配置项组成。
config文件的格式比较简单,通常使用英文或中文进行编写。
config文件的语法规则如下:* 配置项以键值对的形式表示,用等号“=”连接键和值;* 配置项之间用逗号或分号隔开;* 配置项可以包含空格和特殊字符;* 配置项的值可以是文本、数字、布尔值等。
二、config文件的编辑工具常用的编辑工具有文本编辑器、编辑器、Visual Studio Code 等。
其中,文本编辑器是最简单的方法,适合初学者使用。
编辑器可以提供更多的编辑功能,如语法高亮、自动补全等。
Visual Studio Code是一款跨平台的编辑器,适用于编写多种编程语言,对于config 文件的编辑也具有较好的支持。
三、config文件的常用设置config文件中的常用设置包括设置应用程序的端口号、数据库连接信息、日志文件路径等。
以下是一些示例:* 设置应用程序的端口号:```phpPORT=8080```* 设置数据库连接信息:```makefileDB_HOST=localhostDB_USER=rootDB_PASSWORD=123456DB_NAME=mydatabase```* 设置日志文件路径:```makefileLOG_PATH=C:/log/myapp.log```四、config文件的加载和使用config文件通常在应用程序启动时加载和使用。
mentcomment相当于插入语句,不起实际作用,只是起显示一句话如:comment "****Boot options******"bool 后面+字符串(tristate与bool一样,只是多了一个M选项,意思是编译成动态模块,不是直接加载到内核的,而是单独编译成模块,需要时再加载,适合于外设驱动程序)如:config S3C_BOOT_WATCHDOGbool "S3C Initialisation watchdog"depends on S3C2410_W ATCHDOGhelpSay y to enable the watchdog during the kernel decompression其中关键字config ,bool ,depends on当S3C2410_W ATCHDOG被定义时,显示[ ] S3C Initialisation watchdog 选项用空格来选择Y or N . bool 是用来定义Y或者N 的,当选择Y 时,则配置CONFIG_S3C_BOOT_W ATCHDOG在Makefile 中obj-$( CONFIG_S3C_BOOT_W ATCHDOG) += watchdog.o 则该语句有效,编译watchdog.c 文件3. int 的用法config S3C2410_PM_CHECK_CHUNKSIZEint "S3C UART to use for low-level messages"default 0 //若要写成默认值100 则括号里面就是100helpChoice of which UART port to use for the low-level messages,箭头的使用如下:蓝色部分//****************以下设置菜单前有选项[ ]**************************menuconfig NETbool "Networking support"select NLATTR---help---Unless you really know what you are doing, you should say Y here.。
Linux源码Kconfig⽂件语法分析Kconfig是我们进⾏内核配置的关键⽂件,⽤于⽣成menuconfig的界⾯并⽣成最终确定编译选项的.config⽂件。
关于Kconfig⽂件的编写规则,在Documentation/kbuild/kconfig-language.txt有详尽的叙述。
这⾥主要⽤实例进⾏语法分析。
config确定了条⽬前⾯是否有选项,menuconfig界⾯中的条⽬中⼀共有3种主动选项,分别是[ ],< >和( ),分别表⽰"被编译进内核or舍弃","编译进内核or编译成模块or舍弃", "按照提⽰输⼊⼀个数字",分别对应Kconfig⽂件中的bool,tristate和int。
{ }和- -属于被动选项,是配置系统根据依赖关系⾃动⽣成的选项,不能被⼿动修改。
menu/endmenu即图形界⾯中有--->的条⽬,回车后可以展开。
条⽬前⾯没有选项!menuconfig是menu和config的结合体,既在前⾯有选项,回车后也可以展开。
choice/endchoice展开之后会有多选⼀的界⾯,每种选项都有独⽴的config管理commentif/endif如果if之后的值被选定了,⾥⾯的内容才能展开source表⽰调⽤指定路径的Kconfig,相当于C中的include,上例已经给出说明depends on实现配置的相当关键的关键字,表⽰当前选项依赖于另外⼀个选项,如果另外⼀个不选,这个都不会出现。
select另⼀个相当关键的关键字,表⽰当前选项需要另外选项的⽀持,如果选了当前选项,那么其后的选项会被强制选择,{ }或- -就是这个实现的。
下例中,只要这些Kconfig中进⾏了"select HAVE_ARM_ARCH_TIMER",都会导致"HAVE_ARM_ARCH_TIMER"被强制选择,表现在menuconfig上就是"Architected timer support"被强制选定.config⽂件分析经过适当的配置之后保存就会在顶层⽬录下⽣成.config⽂件=y表⽰该配置将会被编译进内核,=m表⽰该配置需要单独编译成模块。
linux内核中Kconfig文档的作用以及Kconfig的语法2.6内核的源码树目录下一般都会有两个文文:Kconfig 和Makefile。
分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。
在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。
在内核编译时,主Makefile调用这个.config,就知道了用户对内核的配置情况。
上面的内容说明:Kconfig就是对应着内核的配置菜单。
假如要想添加新的驱动到内核的源码中,可以通过修改Kconfig来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的Makefile。
因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个)*Kconfig*Makefile要想知道怎么修改这两种文件,就要知道两种文档的语法结构。
First: Kconfig每个菜单项都有一个关键字标识,最常见的就是config。
语法:configsymboloptions<!--[if !supportLineBreakNewLine]-->< ;!--[endif]-->symbol就是新的菜单项,options是在这个新的菜单项下的属性和选项其中options部分有:1、类型定义:每个config菜单项都要有类型定义,bool:布尔类型,tristate三态:内建、模块、移除,string:字符串,hex:十六进制,integer:整型例如config HELLO_MODULEbool "hello test module"bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.2、依赖型定义depends on或requires指此菜单的出现是否依赖于另一个定义config HELLO_MODULEbool "hello test module"depends on ARCH_PXA 这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效,即只有在选择了ARCH_PXA,该菜单才可见(可配置)。
3、帮助性定义只是增加帮助用关键字help或---help---<!--[if !supportLineBreakNewLine]--><!--[en dif]-->更多详细的Kconfigconfig语法可参考:Second: 内核的Makefile内核的Makefile分为5个组成部分:Makefile 最顶层的Makefile.config 内核的当前配置文档,编译时成为顶层Makefile的一部分arch/$(ARCH)/Makefile 和体系结构相关的Makefiles/ Makefile.* 一些Makefile的通用规则kbuild Makefile 各级目录下的大概约500个文档,编译时根据上层Makefile传下来的宏定义和其他编译规则,将源代码编译成模块或编入内核。
顶层的Makefile文档读取 .config文档的内容,并总体上负责build内核和模块。
Arch Makefile则提供补充体系结构相关的信息。
s目录下的Makefile文档包含了任何用来根据kbuild Makefile 构建内核所需的定义和规则。
(其中.config的内容是在make menuconfig的时候,通过Kconfig文档配置的结果)在linux2.6.x/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。
最后举个例子:假设想把自己写的一个flash的驱动程式加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?能够分三步:第一:将您写的flashtest.c 文档添加到/driver/mtd/maps/ 目录下。
第二:修改/driver/mtd/maps目录下的kconfig文档:config MTD_flashtesttristate “ap71 flash"这样当make menuconfig时,将会出现ap71 flash选项。
第三:修改该目录下makefile文档。
添加如下内容:obj-$(CONFIG_MTD_flashtest) += flashtest.o这样,当您运行make menucofnig时,您将发现ap71 flash选项,假如您选择了此项。
该选择就会保存在.config文档中。
当您编译内核时,将会读取.config文档,当发现ap71 flash 选项为yes 时,系统在调用/driver/mtd/maps/下的makefile 时,将会把flashtest.o 加入到内核中。
即可达到您的目的。
2.6内核的源码树目录下一般都会有两个文文:Kconfig和Makefile。
分布在各目录下的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。
在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出配置菜单,用户配置完后保存到.config(在顶层目录下生成)中。
在内核编译时,主Makefile调用这个.config,就知道了用户对内核的配置情况。
上面的内容说明:Kconfig就是对应着内核的配置菜单。
假如要想添加新的驱动到内核的源码中,可以通过修改Kconfig来增加对我们驱动的配置菜单,这样就有途径选择我们的驱动,假如想使这个驱动被编译,还要修改该驱动所在目录下的Makefile。
因此,一般添加新的驱动时需要修改的文件有两种(注意不只是两个)*Kconfig*Makefile要想知道怎么修改这两种文件,就要知道两种文档的语法结构。
First: Kconfig每个菜单项都有一个关键字标识,最常见的就是config。
语法:configsymboloptions<!--[if !supportLineBreakNewLine]-->< ;!--[endif]-->symbol就是新的菜单项,options是在这个新的菜单项下的属性和选项其中options部分有:1、类型定义:每个config菜单项都要有类型定义,bool:布尔类型,tristate 三态:内建、模块、移除,string:字符串,hex:十六进制,integer:整型例如config HELLO_MODULEbool "hello test module"bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.2、依赖型定义depends on或requires指此菜单的出现是否依赖于另一个定义config HELLO_MODULEbool "hello test module"depends on ARCH_PXA 这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效,即只有在选择了ARCH_PXA,该菜单才可见(可配置)。
3、帮助性定义只是增加帮助用关键字help或---help---<!--[if !supportLineBreakNewLine]--><!--[en dif]-->更多详细的Kconfigconfig语法可参考:Second: 内核的Makefile内核的Makefile分为5个组成部分:Makefile 最顶层的Makefile.config 内核的当前配置文档,编译时成为顶层Makefile的一部分arch/$(ARCH)/Makefile 和体系结构相关的Makefiles/ Makefile.* 一些Makefile的通用规则kbuild Makefile 各级目录下的大概约500个文档,编译时根据上层Makefile传下来的宏定义和其他编译规则,将源代码编译成模块或编入内核。
顶层的Makefile文档读取 .config文档的内容,并总体上负责build内核和模块。
Arch Makefile则提供补充体系结构相关的信息。
s目录下的Makefile文档包含了任何用来根据kbuild Makefile 构建内核所需的定义和规则。
(其中.config的内容是在make menuconfig的时候,通过Kconfig文档配置的结果)在linux2.6.x/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。
最后举个例子:假设想把自己写的一个flash的驱动程式加载到工程中,而且能够通过menuconfig配置内核时选择该驱动该怎么办呢?能够分三步:第一:将您写的flashtest.c 文档添加到/driver/mtd/maps/ 目录下。
第二:修改/driver/mtd/maps目录下的kconfig文档:config MTD_flashtesttristate “ap71 flash"这样当make menuconfig时,将会出现ap71 flash选项。
第三:修改该目录下makefile文档。
添加如下内容:obj-$(CONFIG_MTD_flashtest) += flashtest.o这样,当您运行make menucofnig时,您将发现ap71 flash选项,假如您选择了此项。
该选择就会保存在.config文档中。
当您编译内核时,将会读取.config文档,当发现ap71 flash 选项为yes 时,系统在调用/driver/mtd/maps/下的makefile 时,将会把flashtest.o 加入到内核中。