我是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
请告知我错过了什么或做错了什么..
答案 0 :(得分:1)
生成文件
obj-m:= hello.o#Module Name是hello.c
KDIR:= / lib / modules / $(shell uname -r)/ build
全部:$(MAKE)-C $(KDIR)M = $(PWD)模块
清洁:$(MAKE)-C $(KDIR)M = $(PWD)清洁$(RM)Module.markers modules.order
不能保证头文件总是位于/ usr / src目录中,但肯定会位于/ lib / modules目录中。
找出要存在的头文件 跑'
uname -r
在终端上,输出就像
3.5.0-17-generic
安装头文件运行
sudo apt-get install linux-headers-$(uname -r)
答案 1 :(得分:0)
你有:
$(MAKE) -C $(src) SUBDIR-$(PWD) modules
但似乎你想要:
$(MAKE) -C $(src)/SUBDIR-$(PWD) modules
或类似的东西;源代码在哪里生活?你需要-C
那里。
答案 2 :(得分:0)
内核构建系统有点复杂。阅读kernel build process文档会很好。这样可以更好地理解
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
等...