web-dev-qa-db-ja.com

linux / init.h:そのようなファイルやディレクトリはありません

クラスのカーネルモジュールを構築しようとすると、大量のエラーの壁が発生しますが、その壁の上部には、悪名高い「そのようなファイルまたはディレクトリはありません」というエラーがあります。それが問題の根源のようです。これは、init.hだけでなく、module.hとkernel.hにも影響を与えるようです。プログラムの最初の3行は次のようになります。

#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");
8
Robert Crawford

最初に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 を参照してください。

4
Parham Alvani

カーネルモジュールをビルドするときは、makeファイルを使用する必要があります

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
izak

完全なコード「/ usr/include ...」の最初の行にタイプミスがあり、init.hが見つからない原因となる可能性があります。

0
GEphil