天天育儿网,内容丰富有趣,生活中的好帮手!
天天育儿网 > Kconfig文件结构(图文)简介

Kconfig文件结构(图文)简介

时间:2019-02-26 19:47:27

相关推荐

Kconfig文件结构(图文)简介

1Kconfig和Makefile

毫不夸张地说,Kconfig和Makefile是我们浏览内核代码时最为依仗的两个文件。基本上,Linux内核中每一个目录下边都会有一个Kconfig文件和一个Makefile文件。Kconfig和Makefile就好似一个城市的地图,地图引导我们去认识一个城市,而Kconfig和Makefile则可以让我们了解一个内核目录下面的结构。在希望研究内核的某个子系统、某个驱动或其他某个部分时,都有必要首先仔细阅读一下相关目录下的Kconfig和Makefile文件。 分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单。在内核配置makemenuconfig时,从Kconfig中读出菜单,用户选择后保存到.config的内核配置文档中。在内核编译时,主Makefile调用这个.config,就知道了用户的选择。 假如想使这个驱动被编译,则要修改Makefile文件,因此,需要添加新的驱动时,需要修改的文件有两个:Kconfig,Makefile.

2菜单组织结构

一般一个Kconfig文件表示的就是一个菜单,一个菜单由多个菜单项组成,其格式如下:

menu菜单名

菜单项或菜单链接1

菜单项或菜单链接2

...

菜单项或菜单链接n

endmenu

复制代码

其中菜单项就是指菜单的子菜单,所谓菜单链接就是指链接到另一个Kconfig文件,如此一下,菜单就可以实现随意嵌套了.

例如:

#drivers/Kconfig

menu"DeviceDrivers"

source"drivers/base/Kconfig"

source"drivers/connector/Kconfig"

source"drivers/mtd/Kconfig"

source"drivers/of/Kconfig"

source"drivers/parport/Kconfig"

source"drivers/pnp/Kconfig"

source"drivers/block/Kconfig"

source"drivers/hello/Kconfig"

configtest

bool"提示字符串"

defaulty

...

endmenu

复制代码

2.1菜单项

语法:

config<symbol>

<configoptions>

复制代码

<symbol>为一符号,就好像代码中的局部变量x一样,可用于后边的表达式中.

例如:

configUEVENT_HELPER_PATH

string"pathtoueventhelper"

dependsonHOTPLUG

default"/sbin/hotplug"

help

Pathtoueventhelperprogramforkedbythekernelfor

everyuevent.

复制代码

上面菜单项的属性string表示菜单的类型,每一个菜单项必须有一个类型.

注:每个config菜单项都会产生一个配置选项CONFIG_XXX,XXX即为<symbol>.如上,则会产生一个配置项:CONFIG_UEVENT_HELPER_PATH,此配置项的值记录在内核根目录下的隐藏文件.config内,例:~/WORKING_DIRECTORY/kernel/goldfish/.config文件内.

2.2菜单链接

菜单链接的格式如下:

source"路径"

复制代码

如:

source"drivers/pnp/Kconfig"

复制代码

2.3菜单属性2.3.1类型

类型可以是:bool、tristate、string、hex和int。 bool类型的只能选中或不选中,选中为y,不选中为n. tristate类型的菜单项为值可为三种值,多了编译成内核模块的选项。其值可为y,n,m. string类型表示需要用户输入一串字符串。 hex类型则需要用户输入一个16进制数。 int类型表示用户输入一个整型. 总结:

菜单类型属性就好比一个控件,bool相当于单选框,trstate相当于有三种状态的复选框,string相当于供用户输入字符串的文本编辑框,hex相当于供用户输入16进制数的文本编辑框,而int就相当于供用户输入整型数的文本编辑框。 类型关键字后边可跟随提示字符,也可以不跟随,取决于情况。如:

string"pathtoueventhelper"

复制代码

bool"Preventfirmwarefrombeingbuilt"

复制代码

注:每一个菜单项必须有类型属性。

2.3.2默认值

默认值属性default一般在类型属性后边,如:

configUEVENT_HELPER_PATH

string"pathtoueventhelper"

default"/sbin/hotplug"

复制代码

表示当前菜单项若用户没有选择或输入任何值时,所取的默认值.上述所示为当前的默认值为"/sbin/totplug".

2.3.3依赖

依赖可以是"dependson"或"requires". 语法:

dependson/requires<expr>

复制代码

<expre>为表达式,可为之前定义的菜单项名.

如:

dependsonHOTPLUG

复制代码

表示此菜单项显示与否取决于另外一个菜单项HOTPLUG,只有当菜单项HOTPLUG这个菜单项有效显示,当前菜单项才会显示。

例如:

configMODULES

bool"Enableloadablemodulesupport"

configMODVERSIONS

bool"Setversioninformationonallmodulesymbols"

dependsonMODULES

comment"modulesupportdisabled"

dependson!MODULES

复制代码

菜单项MODVERSIONS的显示与否取决于菜单项MODULES。这种信赖关系常用在子菜单项中。

2.3.4选择

语法:

choice

选择项

..

endchoice

复制代码

2.3.5提示

语法:

comment"提示信息字符串"

comment选项

复制代码comment只是用来给用户提示信息的,后跟字符串,此字符串也可以在终端中显示。 comment选项只可以是depondson。

2.3.6帮助

语法:

help/---help---<字符串>

复制代码

例如:

configEXTRA_FIRMWARE_DIR

string"Firmwareblobsrootdirectory"

dependsonEXTRA_FIRMWARE!=""

default"firmware"

help

Thisoptioncontrolsthedirectoryinwhichthekernelbuildsystem

looksforthefirmwarefileslistedintheEXTRA_FIRMWAREoption.

Thedefaultisthefirmware/directoryinthekernelsourcetree,

butbychangingthisoptionyoucanpointitelsewhere,suchas

the/lib/firmware/directoryoranotherseparatedirectory

containingfirmwarefiles.

复制代码

help相当于注释一样,在给编辑Kconfig文件的人看的,这样可以保持其可读性.

3举例

Kconfig:

#drivers/Kconfig

menu"DeviceDrivers"

source"drivers/base/Kconfig"

source"drivers/connector/Kconfig"

source"drivers/mtd/Kconfig"

...

endmenu

复制代码

其对应的makemenuconfig界面如下图所示:

source"drivers/base/Kconfig"中的Kconfig内容如下:即对应着上图中的第一项"GenericDriverOption"的子菜单内容:

这里不再列出来!

显示效果如下图所示:

各个目录下的Kconfig文件经过最终配置,最终会在内核根目录下生成一个.config文件,这是个隐藏文件,这个文件记录着各个选项的配置及值。供Makefile文件使用.使用命令:ls-al可看到! 如: .config:

#

#Automaticallygeneratedmakeconfig:don'tedit

#Linuxkernelversion:2.6.29

#ThuDec1521:15:25

#

CONFIG_ARM=y

CONFIG_SYS_SUPPORTS_APM_EMULATION=y

#CONFIG_GENERIC_GPIOisnotset

CONFIG_GENERIC_TIME=y

CONFIG_GENERIC_CLOCKEVENTS=y

CONFIG_MMU=y

#CONFIG_NO_IOPORTisnotset

CONFIG_GENERIC_HARDIRQS=y

CONFIG_STACKTRACE_SUPPORT=y

CONFIG_HAVE_LATENCYTOP_SUPPORT=y

CONFIG_LOCKDEP_SUPPORT=y

CONFIG_TRACE_IRQFLAGS_SUPPORT=y

CONFIG_HARDIRQS_SW_RESEND=y

CONFIG_GENERIC_IRQ_PROBE=y

CONFIG_RWSEM_GENERIC_SPINLOCK=y

#CONFIG_ARCH_HAS_ILOG2_U32isnotset

#CONFIG_ARCH_HAS_ILOG2_U64isnotset

CONFIG_GENERIC_HWEIGHT=y

CONFIG_GENERIC_CALIBRATE_DELAY=y

CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y

CONFIG_VECTORS_BASE=0xffff0000

CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"

复制代码

每一个CONFIG_xxx记录着之前Kconfig文件内的菜单项的值.

如果觉得《Kconfig文件结构(图文)简介》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。