linux / init.h:没有这样的文件或direcotry

我试图build立一个我的类的内核模块,我得到了一堵墙的错误,但在所述墙的顶部是臭名昭着的“没有这样的文件或目录”的错误。 这似乎是问题的根源。 这不仅似乎影响init.h,还影响到module.h和kernel.h。 程序的前三行如下:

#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> 

我环顾四周,尝试其他的path,这些文件应该是浏览类似的问题,但迄今没有任何工作。 最奇怪的部分是我已经使用了这个模块; 我提供的起始代码在顶部(我没有改变任何东西),并没有给我这个错误。 虽然,后面的代码显然不一样,但是这似乎是目前最大的问题。

完整的代码如下:

 #include <usr/unclude/linux/init.h> #include <usr/include/linux/module.h> #include <usr/include/linux/kernel.h> /* This function is called when the module is loaded. */ int simple_init(void) { printk(KERN_INFO "Loading Module\n"); static LIST_HEAD(birthday_list) struct birthday{ int day; int month; int year; struct list_head list; }; struct birthday *ptr, *next; struct birthday *bob; struct birthday *judy; struct birthday *josh; struct birthday *lana; struct birthday *jan; bob = kmalloc(sizeof(*bob), GFP_KERNEL); bob -> day = 17; bob -> month = 1; bob -> year = 1990; INIT_LIST_HEAD(&bob -> list); ... list_add_tail(bob -> list, &birthday_list); list_add_tail(judy -> list, &birthday_list); list_add_tail(josh -> list, &birthday_list); list_add_tail(lana -> list, &birthday_list); list_add_tail(jan -> list, &birthday_list); struct birthday *ptr; list_for_each_entry(ptr, &birthday_list, list){ kprintf('%d/%d/%d \n', ptr -> month, ptr -> day, ptr -> year); } list_for_each_entry_safe(ptr, &birthday_list, list){ list_del(&ptr->list); kfree(ptr); } return 0; } /* This function is called when the module is removed. */ void simple_exit(void) { printk(KERN_INFO "Removing Module\n"); } /* Macros for registering module entry and exit points. */ module_init( simple_init ); module_exit( simple_exit ); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Simple Module"); MODULE_AUTHOR("SGG"); 

我想你必须先通过apt-get安装linux-headers- [kernel version]之类的东西,然后你必须创建Makefile如下:

 ifneq ($(KERNELRELEASE),) # call from kernel build system lifo-objs := main.o obj-m := lifo.o else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) modules: echo $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINC=$(PWD)/../include modules endif clean: rm -rf *.o *~ core .depend *.mod.o .*.cmd *.ko *.mod.c \ .tmp_versions *.markers *.symvers modules.order depend .depend dep: $(CC) $(CFLAGS) -M *.c > .depend ifeq (.depend,$(wildcard .depend)) include .depend endif 

在上面的Makefile中将KERNELDIR变量设置为适当的内核版本,默认情况下它使用正在运行的内核。 如果你使用这个Makefile,你需要把你的include改成如下格式:

 #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> 

我认为对于使用Linus Torvalds git的标准内核开发的内核模块更好。 对于一些简单的内核模块看看这个 。

在完整代码“/ usr / unclude …”的第一行有一个输入错误,可能导致无法找到init.h