it-swarm.com.de

linux/module.h: Keine solche Datei oder Verzeichnis

ich bin ein Anfänger und versuche einige Grundlagen der Kernel-Programmierung in Linux. Heute morgen habe ich die Datei module.h in VIM geöffnet und geschlossen, ohne die Änderungen ebenfalls zu speichern. Danach kann ich meine Codes nicht mehr zusammenstellen. Ich erhalte folgende Fehlermeldung

[[email protected] helloworld]# cc helloworld.c
helloworld.c:1:25: error: linux/module.h: No such file or directory
[[email protected] helloworld]# 

Hier ist ein Beispielcode, der bis zum letzten Tag erfolgreich ausgeführt wurde.

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

int init_module(void)
{
        printk("HELLO WORLD");
        return 0;
}

void cleanup_module(void)
{
        printk("GOODBYE");
}

Ich habe wie folgt nach der Datei module.h gesucht und sie existiert

[[email protected] usr]# find . -name module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-x86_64/module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-i386/module.h
./src/kernels/2.6.18-194.el5-i686/include/linux/module.h
./include/sepol/policydb/module.h
./include/sepol/module.h
./include/kde/kunittest/module.h
[[email protected] usr]# 

Bitte helfen Sie mir, ich benutze CentOS in der virtuellen Box.

14
ajishalfred

Sie versuchen, Ihr Modul mit plain gcc ohne das Umgebende kbuild-Framework zu kompilieren. Vielleicht haben Sie mit dieser Vorgehensweise in der Vergangenheit etwas zu tun bekommen, aber es ist schmerzhaft schrecklich schrecklich, wenn Sie versuchen, ein Modul zu verwenden, das etwas anderes als pure-kbuild Makefile-Ansätze verwendet. Ich habe Zu viel von meinem Leben damit verschwendet, gegen kbuild zu kämpfen, und ich möchte nicht, dass dasselbe mit Ihnen __ passiert. Kbuild umarmen und es Ihnen helfen, Ihr Modul zu bauen. Bitteread Documentation/kbuild/modules.txt bevor Sie eine weitere Codezeile schreiben.

Was Sie tun müssen, ist ein Makefile für Ihr Modul zu erstellen. Sein Inhalt sollte so aussehen:

ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m  := modulename.o

else
# normal makefile
    KDIR ?= /lib/modules/`uname -r`/build

default:
$(MAKE) -C $(KDIR) M=$$PWD

endif

Ich weiß, es ist viel komplizierter als die meisten Makefiles, die Sie gewohnt sind, Aber es dient einem doppelten Zweck. Wenn Sie einfach make in Ihrem Verzeichnis ausführen, wird make erneut aufgerufen, um den Kbuild-Mechanismus aus dem aktuell laufenden Kernel Zu verwenden (vorausgesetzt, er hat mindestens einen Symlink von /lib/modules/.../build zur richtigen Stelle ) ).

Der erneut aufgerufene Befehl make ($(MAKE)) wird Ihr Modul ordnungsgemäß erstellen, und Sie sparen mehr Zeit, als Sie je schätzen können. (Ja wirklich.)

Halten Sie Documentation/kbuild/modules.txt an Ihrer Seite, während Sie diese Funktion ausführen.

Hinweis: Documentation/kbuild/modules.txt ist möglicherweise in Ihrem Linux-System unter /usr/share/linux-headers-$(uname -r)/Documentation/kbuild/modules.txt verfügbar.

25
sarnold

Installieren Sie das Paket Kernel-devel:

yum install kernel-devel

Danach sollten Sie haben: 

/usr/src/kernels/$kernelversion/include/linux/module.h

Sie können dann so etwas passieren:

-I/usr/src/kernels/$(uname -r)/include

an den Compiler

6
duncan

Möglicherweise benötigen Sie ein Makefile, um Ihr Modul zu kompilieren. Ich habe es auf meinem PC (Ubuntu 10.04.4) ausprobiert. Ich habe das gleiche Problem, wenn ich gcc -c hello.c verwende. Wenn Sie jedoch ein Makefile verwenden, ist alles in Ordnung. Die Kernelversion ist 2.6 .32-54-generic

0
njuzwr