【Linux学习小技巧】Linux内核开发工具介绍2
通过make menuconfig(make xconfig或者make gconfig)命令配置内核的时候,从Kconfig文件读取菜单,配置完毕保存到文件名为.config的内核配置文件中,供Makefile文件在编译内核时使用。
1.1.1 Kconfig基本语法
程序清单1drivers/char/Kconfig片段
menu "Character devices"
source "drivers/tty/Kconfig"
config DEVKMEM
bool "/dev/kmem virtual device support"
default y
help
Say Y here if you want to suppor
1. 子菜单
子菜单的菜单项则由config来定义,随后的“bool”、“default”、“help”等都是该菜单项的属性:
config DEVKMEM
bool "/dev/kmem virtual device support"
这两行语句定义了一个bool选项,在.config中的配置变量名称为CONFIG_DEVKMEM,选项提示信息为“/dev/kmem virtual device support”,在内核配置界面的实际表现为:
[*] /dev/kmem virtual device support
由于设置其默认属性default为y,所以该选项默认选中。
help引出帮助信息,在内核配置界面,选择选项后,通过
2. 属性
类型定义:每个菜单项都必须定义类型,可选类型有:bool、tristate、string、hex和int,各类型描述如表1所列。
表1菜单项类型和说明
定义选项的类型后面可以加菜单信息,用引号(“”)给出,留空则不加提示信息。
对于布尔型选项,在配置界面用[]表示:
[*] /dev/kmem virtual device support
[*]表示选中,对应CONFIG_XXX=y,[ ]则表示未选中。
对于三态选项,在配置界面用<>表示:
<*> Kernel .config support
<*>表示选中,对应CONFIG_XXXx=y,
子菜单也可同时设置类型,如下列代码在定义PWM菜单的同时定义了菜单属性为三态:
menuconfig GENERIC_PWM
tristate "PWM Support"
default n
help
Enables PWM device support implemented via a generic
framework.If unsure, say N.
在配置界面表现为:
<> PWM Support--->
说明:子菜单的配置值会影响其子选项的可能值。例如三态子菜单配置为
默认值:有写选项可以设置默认值,无论是哪种类型,都可以通过default设置其默认值,例如:
config ARM
bool
default y
select HAVE_AOUT
选中:前面这个示例的select,表示了一种选中关系,即选中某个选项后,会自动选中某个或者某些选项。前面这个示例表明,选中Arm®后,会自动选中HAVE_AOUT。
依赖关系:如果一个选项能否生效与否与其它选项的设置有关,则必须通过depends on来声明这种依赖关系。例如,只有使能了SMP才能设置CPU个数变量NR_CPUS,在Kconfig中则写成:
config NR_CPUS
int "Maximum number of CPUs (2-32)"
range 2 32
depends on SMP
default "4"
帮助:通过help关键字引入帮助,帮助的正文必须另起一行。
菜单选项属性的每个关键字,必须用TAB键与行首隔开,不能用等数的空格替代。
3. 目录层次迭代
通过source可以直接引用下级目录的Kconfig文件,形成新的菜单项或者子菜单,这样方便每个目录独立管理各自的配置内容。“source "drivers/tty/Kconfig"”就是直接引用
1.1.2 配置项和配置开关
通过config定义的菜单配置项,在内核配置后会产生一个以“CONFIG_”开头的配置开关变量,该开关变量可在Makefile中或者源代码中使用。
例如:“config BAR”将会产生一个开关变量CONFIG_BAR,在Makefile中可以这么使用:
obj-$(CONFIG_BAR)+= file_bar.o
在源代码中可用这个开关变量在源代码中可用这个开关变量来进行一些条件处理,例如:
#if defined (CONFIG_BAR)
实际处理代码
#endif
如果定义的BAR是三态变量,则还可以根据需要这样使用:
#if defined (CONFIG_BAR)|| defined (CONFIG_BAR_MODULE)
实际处理代码
#endif