【问题标题】:linux/init.h: No such file or directorylinux/init.h:没有这样的文件或目录
【发布时间】:2015-04-10 00:02:21
【问题描述】:

我正在尝试为我的班级构建一个内核模块,但我遇到了一大堵错误墙,但在所述墙的顶部是臭名昭著的“没有这样的文件或目录”错误。这似乎是问题的根源。这似乎不仅会影响 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的包含路径是什么?
  • 你能发布你的代码吗?你在使用 /lib/module 中提供的 Makefile 吗?
  • 好吧,我有几件事要报告。一方面,init.h 和 module.h 似乎消失了。此外,我试图解决这个问题,但事情......不知何故出了问题。我尝试使用命令“sudo apt-get install linux-headers-generic”,它给了我一条错误消息:“E: Package 'linux-headers-generic' has no installation Candidate.”
  • 我没有使用您所说的 Makefile,但我尝试运行的模块目录中有一个。至于发布代码,中间有很多填充物,这并不重要……我会努力把它发布;我让它在虚拟机上运行。

标签: c linux module kernel debian


【解决方案1】:

我认为您必须首先通过 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 <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

我认为对于内核模块开发使用来自Linus Torvalds git 的标准内核更好。一些简单的内核模块见this

【讨论】:

  • 好吧,关于它的事情是这是一个分配,因此我们得到了一个正确的makefile来下载并放入正确的目录(我这样做了,因为它至少已经工作了一次)我尝试获取标题...这是我需要输入终端的确切输入吗?
  • 不,您必须先使用uname -r 来获取内核版本,然后使用sudo apt-get install linux-headers-3.13.0-24-generic 之类的东西来获取适当版本的内核头文件。
  • 是的,那没用。和上面的 cmets 一样,它找不到我要安装的东西
  • 好的,请将您的uname -r 输出发送给我。
  • 这真的很奇怪,现在它似乎无缘无故地工作了。在今天见到我的教授之前,我试图完成它,但没有成功。我们今天早上打开它,运行它,确实出现了一堆错误,但这不是其中之一。感谢您试一试!
【解决方案2】:

在构建内核模块时,您应该使用 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) $@

【讨论】:

    【解决方案3】:

    完整代码“/usr/unclude...”的第一行有一个错字,这可能是找不到 init.h 的原因

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多