- 论坛徽章:
- 0
|
大家好,我知道内核模块的编译可以分为两种,一种在内核源码树内编译,另一种在内核源码树外编译。
1、在内核源码树内编译主要是修改Kconfig和Makefile
(1)比如有个hello.c模块源代码,我只要把它放到内核源码树的drivers/char/目录下,
修改drivers/char/目录下的Kconfig ,
添加如下语句
config HELLO_MODULE
tristate "modules device support"
default y
help
Say Y here,the modules will be build in kernel.
Say M here,the modules willbe build to modules.
Say N here,there will be nothing to be do.
让它在make menuconfig的时候有选择项
然后修改/drivers/char/目录下的Makefile
添加一条语句 obj-$(CONFIG_HELLO_MODULE)+=hello.o
就可以了。
(2)如果把hello.c放在hello目录下,并把hello目录放到drivers/char/目录下
那么drivers/char/ 目录下面的Makefile就应该添加这样的语句
obj-y+=hello/
在drivers/char/hello/目录下添加Makefile如下
obj-y+=hello.o
2、在内核源码树外编译内核模块
在hello.c所在的文件夹里
$vim Makefile
obj-m=hello.o
all:
$(MAKE) -C $(KER_DIR) M=$(shell pwd) modules
如果hello.c是放在子目录hello里面的
则主目录里的Makefile应这样写
obj-m=hello.o
all:
$(MAKE) -C $(KER_DIR) M=$(shell pwd)/hello/ modules
现在有个问题啊,我想在子目录写个Makefile,能像内核源码树里的Makefile一样能递归调用,
子目录里的Makefile和主目录里的Makefile都应该怎么写?
我在子目录里写Makefile obj-y+=hello.o
我在主目录里的Makefile里添加
obj-m=test.o
test-y+=hello/ 是没有效果的 (同时子目录的Makefile添加了obj-y+=hello.o)
那么在内核源码树外编译内核模块如何写主目录和子目录的Makefile,让它们像在内核源码树里一样递归调用呢? |
|