Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Kernel Modul

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
02.04.2007, 19:21 Uhr
berton



Hallo zusammen!
Ich versuche jetzt schon einige Zeit ein kleines Kernelmodul zu bauen. Es ist zum verrückt werden. Es will einfach nicht klappen

Hier das modul

C++:
#include <linux/module.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/version.h>

MODULE_LICENSE("GPL");

static __init mod1_init (void)
{
printk("Funktion 'init_module' wurde aufgerufen!");
return 0;
}

static void __exit mod1_exit(void)
{
printk("Funktion 'cleanup_module' wurde aufgerufen!");
return;
}

module_init(mod1_init);
module_exit(mod1_exit);



Hier das Makefile


Code:
obj-m += mod1.o



Aufruf per:
make -C /home/berton/linux/ SUBDIRS=$PWD modules

Die Fehler:

Code:
In Datei, eingefügt von include/linux/module.h:10,
                    von /home/berton/linux/drivers/misc/mod1.c:1:
include/linux/sched.h:4:37: asm/param.h: Datei oder Verzeichnis nicht gefunden
In Datei, eingefügt von include/linux/posix_types.h:47,
                    von include/linux/types.h:13,
                    von include/linux/capability.h:16,
                    von include/linux/sched.h:7,
                    von include/linux/module.h:10,
                    von /home/berton/linux/drivers/misc/mod1.c:1:
/usr/lib/gcc-lib/i486-linux/3.3.5/include/asm/posix_types.h:13:22: features.h: Datei oder Verzeichnis nicht gefunden
/usr/lib/gcc-lib/i486-linux/3.3.5/include/asm/posix_types.h:14:35: Kein Include-Pfad, um asm/posix_types.h zu finden
In Datei, eingefügt von include/linux/capability.h:16,
                    von include/linux/sched.h:7,
                    von include/linux/module.h:10,
                    von /home/berton/linux/drivers/misc/mod1.c:1:
include/linux/types.h:14:23: asm/types.h: Datei oder Verzeichnis nicht gefunden
In file included from include/linux/capability.h:16,
                 from include/linux/sched.h:7,
                 from include/linux/module.h:10,
                 from /home/berton/linux/drivers/misc/mod1.c:1:
include/linux/types.h:18: error: Syntaxfehler before "__kernel_dev_t"
include/linux/types.h:18: Warnung: type defaults to `int' in declaration of `__kernel_dev_t'
........

include/linux/stat.h:68: error: storage size of `atime' isn't known
include/linux/stat.h:69: error: storage size of `mtime' isn't known
include/linux/stat.h:70: error: storage size of `ctime' isn't known
make[1]: *** [/home/berton/linux/drivers/misc/mod1.o] Fehler 1
make: *** [_module_/home/berton/linux/drivers/misc] Fehler 2



Hat jemand mal einen kleinen Hinweiß für mich?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.04.2007, 21:32 Uhr
Pablo
Supertux
(Operator)


Ja, benutze diese Makefile


Code:
ifeq ($(KERNELRELEASE),)

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

PWD := $(shell pwd)

modules:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers

.PHONY: modules modules_install clean

else

    obj-m := mod1.o

endif




dann reicht es ein 'make' einzugeben.

Wenn ich mir deine Fehlermeldung anschaue, dann sieht es für mich so aus, dass du kaputte linux-headers bzw. nicht 2.6 kompatible. Um 2.6 Module zu bauen, musst du einen ganzen Linux-Tree haben, der konfiguriert und gebaut ist.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.04.2007, 13:09 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Guggst du FAQ

btw. Hast du die Kernel-Header installiert?
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 03.04.2007 um 13:10 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.04.2007, 13:48 Uhr
berton



Okey alles klar!
Danke euch beiden!!! Super es hat gerade zum ersten mal funktioniert. Wow! Was für ein Erfolgserlebniss
Ich arbeite mit debian und hatte nur die Sources installiert die Headerdateien waren noch nicht installiert. Danke für den Tip.

Jetzt habe ich aber noch eine Frage:
Das Modul wird jetzt fehlerfrei erzeugt.
Wenn ich dann insmod mod1.o aufrufe, dann kommt die Meldung: "-1 Invalid module format".
Wenn ich hingegen insmod mod1.ko aufrufe, dann klappt alles einwandfrei.
Ich dachte das eigentliche Modul ist das mit der Endung "o", oder wie ist das ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.04.2007, 14:44 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Das mit der Endung .o ist die Object-Datei. Das ist die Datei, die der Linker dann verarbeitet und zu der .ko macht. Die .ko Datei ist schon dir richtige ...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.04.2007, 16:59 Uhr
berton



oh ja, stimmt. Jetzt wo du es sagst. Das habe ich doch mal in irgendeinem C-Buch gelesen. O=Object-Datei. Die der Linker braucht.
Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.04.2007, 21:35 Uhr
Pablo
Supertux
(Operator)


Die Module bei 2.4 enden mit .o. Die Module für 2.6 mit .ko und zwar deswegen, weil die .o Datei (die man an sich benutzen könnte) zusätzlich mit vermagic.o zusammengelinkt wird (deswegen braucht man einen kompilierten Kernel), die zusätzliche Information über die kernel symbols mit sich bringt.

Ansonsten schau dir mal die FAQ (Link siehe oben), das Buch "Linux Device Drivers" ist genau das, was man braucht, um in die Kernel Prog. einzusteigen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: