我是linux内核开发的初学者,并试图在linux中加载一个简单的模块。我已经创建了一个hello.c文件,将作为内核模块加载。
#include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("A Simple Hello World module"); static int __init hello_init(void) { printk(KERN_INFO "Hello world!n"); return 0; } static void __exit hello_cleanup(void) { printk(KERN_INFO "Cleaning up module.n"); } module_init(hello_init); module_exit(hello_cleanup);
这个hello.c和makefile都保存在/home/linux/目录中。
生成文件
obj-m +=hello.o src= /usr/src/linux-headers-3.5.0-17-generic all: $(MAKE) -C $(src) SUBDIR-$(PWD) modules clean: rm -rf *.o *.ko
为了生成.ko文件,当我在终端上从/home/linux目录运行make命令时,我得到以下错误
h2o@h2o-Vostro-1015:~/linux$ make make -C /usr/src/linux-headers-3.5.0-17-generic SUBDIR-/home/h2o/linux modules make[1]: Entering directory `/usr/src/linux-headers-3.5.0-17-generic' make[1]: *** No rule to make target `SUBDIR-/home/h2o/linux'. Stop. make[1]: Leaving directory `/usr/src/linux-headers-3.5.0-17-generic' make: *** [all] Error 2
请告知我遗漏了什么或做错了什么。。
-
Makefile
obj-m:=hello.o#模块名称为hello.c
KDIR:=/lib/modules/$(shell uname-r(/build
所有:$(MAKE(-C$(KDIR(M=$(PWD(模块
clean:$(MAKE(-C$(KDIR(M=$(PWD(clean$(RM(Module.markers模块订单
不能保证头文件总是位于/usr/src目录中,但它肯定位于/lib/modules目录中。
- 确保系统具有最新的头文件
查找要存在的头文件运行`
uname-r
在终端上,输出将类似
3.5.0-17-generic
要安装头文件,请运行
sudo apt-get install linux-headers-$(uname -r)
您有:
$(MAKE) -C $(src) SUBDIR-$(PWD) modules
但你似乎想要:
$(MAKE) -C $(src)/SUBDIR-$(PWD) modules
或者类似的东西;源代码在哪里?你需要在那里-C
。
内核构建系统有点复杂。最好阅读内核构建过程文档。这样可以更好地理解
- 目标如---
modules / modules_install
- 选项如---
-C $KDIR / M=$PWD
- 命令语法---
-
$ make -C <path_to_kernel_src> M=$PWD
$ make -C /lib/modules/
uname-r/build M=$PWD
$ make -C /lib/modules/
uname-r/build M=$PWD modules_install
- 可加载模块目标---
obj-m
等等。。。