Fehler im Kernel Header? Problem beim Erstellen von Kernelmodul Beispiel



  • Hey Leute,
    ich beschäftig mich gerade mit Kernelmodulen und arbeite dazu ein open-book ("Linux Gerätetreiber" http://www.oreilly.de/german/freebooks/linuxdrive2ger/book1.html, danke an daHa der diesen Link in einem anderen Thread gepostet hat)

    Das erste Beispiel jedoch:

    #define MODULE
    #include <linux/module.h>
    
    int init_module() { printk("<1>Hallo WElt\n"); return 0; }
    void cleanup_module() { printk("<1>Aus Wiedersehn WElt\n"); }
    

    löst beim kompilieren folgenden Fehler aus:

    storm@localhost ~/C-C++ $ gcc -c modul.c -o modul
    In file included from /usr/include/asm/cputime.h:4,
                     from /usr/include/linux/sched.h:23,
                     from /usr/include/linux/module.h:10,
                     from modul.c:2:
    /usr/include/asm-generic/cputime.h:21: error: Syntaxfehler before "cputime64_t"
    In file included from /usr/include/asm/siginfo.h:4,
                     from /usr/include/linux/signal.h:7,
                     from /usr/include/linux/sched.h:27,
                     from /usr/include/linux/module.h:10,
                     from modul.c:2:
    /usr/include/asm-generic/siginfo.h:61: error: size of array `_pad' is too large
    In file included from modul.c:2:
    /usr/include/linux/module.h:50: error: field `attr' has incomplete type
    /usr/include/linux/module.h:58: error: field `kobj' has incomplete type
    /usr/include/linux/module.h:233: error: field `grp' has incomplete type
    

    Das Buch wurde für 2.0 bis 2.4er Kernel geschrieben, ich hab nen 2.6er und natürlich einen aktuelleren gcc (3.3.6), kann das daran liegen?
    Wenn ja wie erstellt man den heutzutage Kernelmodule?
    Wenn nein, was mach ich dann falsch? Es wird ja wohl kaum wirklich ein Fehler in den Kernel-Headern sein (Jedenfalls keiner der einem nicht mal erlaubt so ein einfaches Beispiel zu kompilieren).

    Wäre für Tipps dankbar. Storm



  • Lass mich jetzt nicht lügen, aber ein Kernelmodul gegen den Userspace zu bauen, wird generell schiefgehen. Die Header (auch Kernel-Header!) in /usr/src sind Bestandteil der libc, und auf die hat der Kernel bekanntlich keinen Zugriff.

    Bei anderen Kerneltreibern, die ausserhalb des Kernels gebaut werden sieht man oft, dass das make im Treiberverzeichnis ein make SUBDIRS=/my/driver/dir modules im Kernelverzeichnis anstößt.

    Achja, einen Kernelquellcode der aktuell laufenden Version und Konfiguration (wenn Du das Modul gleich testen willst) brauchst du auf jeden Fall auch.

    Sorry, dass ich nicht mehr sagen kann, aber vielleicht findest Du über SUBDIRS noch etwas passendes bei Google 😉



  • Kernelmodule im Userspace kannst du nicht bauen (du kannst nicht den kernel mit der glibc linken), du musst die kernel Make Erweiterungen benutzen. Siehe [1], hier findest du eine gute Einfühurng in die Entwicklung von Modulen, und wie man sie baut. Benutze diese Makefile:

    obj-m   := deinmodul.o
    
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD       := $(shell pwd)
    
    all:
            $(MAKE) -C $(KERNELDIR) M=$(PWD)
    
    clean:
            rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
    

    ACHTUNG mach kein copy&paste! Nach den Targets (all:, clean:, usw) musst du ENTER und dann TAB drücken.

    edit: für >=linux-2.6 solltest du die Module so in der Art schreiben.

    #include <linux/init.h>
    #include <linux/module.h>
    MODULE_LICENSE("GPL");
    
    static int hello_init(void)
    {
            printk(KERN_ALERT "Hello, world\n");
            return 0;
    }
    
    static void hello_exit(void)
    {
            printk(KERN_ALERT "Goodbye, cruel world\n");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    

    [1] http://lwn.net/Kernel/LDD3/



  • Ich danke euch für die Aufklärung.
    Der link ist genau das Buch was ich lese nur auf englisch und eben neuer :-).
    Eure Erklärung leuchtet mir soweit ich sie nachvollziehen kann ein.

    Ich werd nun das neuere Buch drucharbeiten auch wenn die Sache hier etwas komplizierter erscheint.

    Danke jedenfalls für eure schnelle Antwort!



  • Storm.Xapek.de schrieb:

    Ich danke euch für die Aufklärung.
    Der link ist genau das Buch was ich lese nur auf englisch und eben neuer :-).
    Eure Erklärung leuchtet mir soweit ich sie nachvollziehen kann ein.

    Ich werd nun das neuere Buch drucharbeiten auch wenn die Sache hier etwas komplizierter erscheint.

    Danke jedenfalls für eure schnelle Antwort!

    dann liest du die 2. Auflage. Die dritte ist für/mit 2.6.10 geschrieben.


Anmelden zum Antworten