linux/init.h:没有这个文件或目录。

17

我想为我的班级构建一个内核模块,但是我遇到了一堵错误信息的墙,而在这堵墙的最上方是臭名昭著的“没有这个文件或目录”错误。它似乎是问题的根源。这不仅影响init.h,还包括module.h和kernel.h。程序的前三行如下:

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

我查看了周围并尝试了其他路径,以寻找类似问题时这些文件应该在哪里,但到目前为止都没有起作用。最奇怪的部分是我已经使用过这个模块。我被提供了带有此内容的入门代码(我没有更改任何内容),它没有给我那个错误。尽管显然后面的代码不同,但目前似乎这是最大的问题。

完整代码如下:

#include </usr/include/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");

你的 init.h 副本在哪里?你传递给 gcc 的 include 路径是什么? - user590028
你能发布你的代码吗?你正在使用/lib/module中提供的Makefile吗? - Parham Alvani
好的,我有几件事要报告。首先,init.h和module.h似乎已经消失了。此外,我试图解决这个问题,但事情似乎出了些问题。我尝试使用命令“sudo apt-get install linux-headers-generic”,但它给了我一个错误信息:“E:包'linux-headers-generic'没有安装候选项。” - Robert Crawford
我没有使用你所说的Makefile,但是在我尝试运行的模块目录中有一个。至于发布代码,中间有很多不重要的填充内容...我会努力将其发布;我已经在虚拟机上运行它了。 - Robert Crawford
4个回答

9

我认为你首先需要通过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标准内核更好。关于一些简单的内核模块,请参考这个链接


好的,关于这件事情,它是为了一个作业,因此我们被给予了一个正确的makefile来下载并放入正确的目录中(我已经做到了,因为它至少曾经工作过),然后我尝试获取头文件...那么这就是我需要在终端中输入的确切输入吗? - Robert Crawford
你必须先使用 uname -r 命令获取你的内核版本,然后使用类似于 sudo apt-get install linux-headers-3.13.0-24-generic 的命令来获取相应版本的内核头文件。 - Parham Alvani
是的,那行不通。就像上面的评论一样,它找不到我想安装的东西。 - Robert Crawford
好的,请在评论中发送您的 uname -r 输出。 - Parham Alvani
真的很奇怪,现在它似乎毫无原因地开始工作了。我本来想在今天会见教授之前完成它,但没能做到。我们今天早上打开它运行,出现了一堆错误,但这不是其中之一。感谢你尝试! - Robert Crawford

5

构建内核模块时,您应该使用Makefile:

obj-m := module_name.o

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

all default: modules
install: modules_install

modules modules_install help clean:
    $(MAKE) -C $(KERNELDIR) M=$(shell pwd) $@

2

正如一些评论所提到的那样,你需要安装这些头文件,稍后它们(发行版维护者)不会将操作系统与驱动程序头文件一起发布,因为并不是每个人都会使用Ubuntu或任何发行版来创建驱动程序。

因此,如果有人使用Ubuntu并遇到上述相同问题,则需要通过以下方式安装通用标头

sudo apt install linux-headers-generic

如果你使用的是像Arch这样的发行版,那么请查找如何安装内核开发头文件,现在只需尝试输入命令,它可能会为您工作,如果不行,请尝试重新启动系统。

#include <init.h>
#include <module.h>

如果还不起作用,您需要找到其他方法,并将文件的编译留给makefile,因此请先安装make。
sudo apt install make

创建一个 make 文件并添加以下行 —
obj-m += foo.o
all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

更多内容请访问 — https://www.linuxquestions.org/questions/programming-9/linux-module-h-915605/


0

完整代码的第一行"/usr/unclude..."中有一个错别字,可能是导致无法找到init.h的原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接