目的
学习使用Menuconfig进行内核编译,裁剪。先将内核复制到虚拟机,在内核源码文件夹下,输入make menuconfig.menuconfig界面是由一级一级kconfig文件进行引用对应的.c文件。最终控制驱动的编译选项。在这里以LED驱动为例。
查看LED驱动
在menuconfig界面内查找LEDS驱动,可知LEDS驱动在Device Drivers选项下的Character devices选项内。
根据讯为给的资料,可知LED驱动在drivers/char下
文件结构
Linux中通过文档的逐层调用,形成调用的菜单结构
menu "Device Drivers"菜单类
– source “xxx”
• menu “Character devices”
– source “xxx”
• 最终选项
– Enable LEDS config
根目录下的kconfig
解压内核源码,进入文件夹,vim Kconfig查看根目录下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可以理解为menuconfig主界面,ARCH为平台,KERNELVERSION内核版本号,在系统文件夹下的Makefile文件中定义。
source "arch/
S
R
C
A
R
C
H
/
K
c
o
n
f
i
g
"
,
在
这
句
中
指
调
用
了
a
r
c
h
/
SRCARCH/Kconfig",在这句中指调用了arch/
SRCARCH/Kconfig",在这句中指调用了arch/SRCARCH/下的Kconfig文件,
在文档arch/arm/Kconfig中可以看到调用了
source "drivers/Kconfig"
Drivers下的Kconfig
由上可知,打开文件夹drivers下的Kconfig文件,可见如下
source "drivers/char/Kconfig"
Drivers文件夹下的char文件夹的Kconfig
在此可以看到LEDS的驱动,与manuconfig界面中一一对应。
最小系统的配置裁剪
使用vim打开char文件夹下的Kconfig。仿照LED_CTL编写,在menuconfig中使用空格 选择驱动配置 “M”为编译成驱动,“空”为不编译到内核 “*” 编译到内核 。添加如下部分,再在根目录下执行make zImage。可在根目录下生成.config文件。
config HELLO_CTL
tristate "Enable HELLO config" (备注:tristate 可以在menuconfig变成“M”,而bool 没有此选项)
default y
help
Enable HELLO config
备注:到此,menuconfig工具意义就在于生成.config文件,编译内核文件时告诉系统哪些要编译进内核。同时通过各层的Makefile文件来连接各个文件。在/drivers/char文件夹下Makefile文件当宏定义LEDS_CTL被定义时,则编译
obj-$(CONFIG_LEDS_CTL) += itop4412_leds.o
如果是自己的驱动仿照上述添加
obj-$(CONFIG_HELLO_CTL) += hello_lsh.o
可以看到hello_lsh.c已经成功编译成hello_lsh.o文件