在编译Linux内核中增加程序需要完成以下3项工作:
- 将编写的源代码拷入Linux内核源代码的相应目录。
- 在目录的Kconfig文件中增加关于新源代码对应项目的编译配置选项
- 在目录的Makefile文件中增加对新源代码的编译条目
假设我们要在内核源代码drivers目录下为ARM体系结构新增如下用于 test driver的树形目录:
|--test
|-- test.c
在内核中增加目录和子目录,我们需要为相应的新增目录创建Makefile和Kconfig文件,而新增目录的父目录中的Kconfig和Makefile能被引用。
在新增的test目录下,应该包含如下Kconfig文件:
#
# TEST driver configuration
#
menu "TEST Driver "
comment " TEST Driver"
config TEST_DRIVER
bool "TEST support "
config TEST_DRIVER_USER
tristate "TEST user-space interface"
depends on TEST_DRIVER
help
TEST Driver Configuration
endmenu
由于 test driver对于内核来说是新的功能,所以需要首先创建一个菜单TEST Driver。然后显示“TEST support”,等待用户选择;接下来判断用户是否选择了TEST Driver,如果是(CONFIG_TEST_DRIVER=y),则进一步显示子功能:用户接口与CPU功能支持;由于用户接口功能可以被编译成内核模块,所以这里的询问语句使用了tristate。
注意:这里config TEST_DRIVER语句最终被同一层Makefile读取到的变量是CONFIG_TEST_DRIVER
为了使这个Kconfig能起作用,修改drivers/Kconfig文件,增加:
source "drivers/test/Kconfig"
脚本中的source意味着引用新的Kconfig文件。
在新增的test目录下,应该包含如下Makefile文件:
# drivers/test/Makefile
#
# Makefile for the TEST
#
obj-$(CONFIG_TEST_DRIVER_USER) += test.o
obj-$(CONFIG_XXX_XXX) += xxx/
(如果还有子目录的话需要在Kconfig中添加相应的变量并且在Makefile中添加上面这句话)
在drivers/Makefile中加入
obj-$(CONFIG_TEST_DRIVER) += test/
使在用户进行内核编译时能够进入test目录。
增加了Kconfig和Makefile之后的新的test属性目录为:
|--test
|-- test.c
|-- Makefile
|-- Kconfig
在内核顶层目录中输入
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- menuconfig
(如果是x86就不需要ARCH和CROSS_COMPILE这两个变量了,我是交叉编译linux)
找到Device Driver---> TEST DRIVER目录:
进入该目录以后可以看到如果没有选中TEST SUPPORT,那么下面的菜单式不会弹出来的,这是由于前面Kconfig中:
config TEST_DRIVER_USER
tristate "TEST user-space interface"
depends on TEST_DRIVER
选择TEST DRIVER以后就会出现下面的TEST user-space interface选项,我们将它选成M,也就是变成内核模块
配置完成以后保存配置 ,然后编译内核模块,这里由于是进行交叉编译,所以会多出ARCH=arm以及CROSS_COMPILE=arm-xilinx-linux-gnueabi-两个变量:
$ make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- modules -j8
CHK include/linux/version.h
CHK include/generated/utsrelease.h
make[1]: u201cinclude/generated/mach-types.hu201du662fu6700u65b0u7684u3002
CALL scripts/checksyscalls.sh
CC [M] drivers/test/test.o
Building modules, stage 2.
MODPOST 23 modules
WARNING: modpost: Found 1 section mismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
CC drivers/test/test.mod.o
LD [M] drivers/test/test.ko