• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

/usr/src/linux/asm fehlt

drewle

Newbie
Hallo zusammen,
ich bin recht neu in der Linux-Welt. Habe mich aber gleich mal richtig rein gestürtzt und wollte ein Modul Programmieren, dass in den Kernel eingehängt werden kann. Hierzu habe ich ein kleines Beispiel gefunden
Code:
#define MODULE
#include <linux/module.h>

int init_module(void)
{
   printk("<1>Hallo, Welt\n");
   return(0);
}

void cleanup_module(void)
{
   printk("<1>Ade, du grausame Welt\n");
}
Beim Übersetzen bekomme ich jetzt den Fehler:
Code:
In file included from /usr/src/linux/include/linux/list.h:6,                      
                 from /usr/src/linux/include/linux/module.h:9,                    
                 from skull.c:2:                                                  
/usr/src/linux/include/linux/prefetch.h:14:27: error: asm/processor.h: Datei oder Verzeichnis nicht gefunden
/usr/src/linux/include/linux/prefetch.h:15:23: error: asm/cache.h: Datei oder Verzeichnis nicht gefunden
...
Das ist auch nicht weiter erstaunlich, denn das Verzeichnis:
/usr/src/linux/asm
gibt es bei mir nicht. Das Verzeichnis:
/usr/src/linux/include
ist aber da.
Muß ich noch ein Package installieren? Ich hab auch gelesen, dass man header irgendwie erzeugen kann!?

Ach ja, ich benutze: OpenSuse 11.2 / Kernel: 2.6.31.8-0.1 (Wie's ausschaut.)

Danke schon mal,
Drewle
 

Appleonkel

Hacker
Für 32bit in
Code:
/usr/src/linux/arch/x86/include/asm/
und 64bit in
Code:
/usr/src/linux/arch/ia64/include/asm/processor.h
Die unterschiedlichen Pfade sind nötig, da das kernel-source*.rpm noarch ist. Du musst den Compiler halt noch ein weiteren Includepath mitgeben.
 

towo

Moderator
Teammitglied
Also ia64 ist nicht für das "normale" 64bit, aka amd64.
32 und 64 Bit nutzen schon länger beide /usr/src/linux/arch/x86/include/asm/
 

Appleonkel

Hacker
towo schrieb:
Also ia64 ist nicht für das "normale" 64bit, aka amd64.
32 und 64 Bit nutzen schon länger beide /usr/src/linux/arch/x86/include/asm/
Und ich hatte mich schon gewundert warum es kein x86_64 gibt, sondern nur die Intel-Architektur :D
 

josef-wien

Ultimate Guru
Da fehlen die Pakete kernel-source und/oder kernel-*-devel (und vielleicht auch noch sonstige Pakete wie z. B. make oder gcc).
 

spoensche

Moderator
Teammitglied
Poste mal die Ausgabe von:

Code:
uname -r

und

Code:
rpm -qa | grep kernel

In den Preprozessor- Anweisungen ist es sinnvoller statt "MODUL" den Modulnamen zu verwenden.

Als Funktionsnamen der Init- und Exitfunktion solltest du die Form
Code:
modulename_init(void)
modulename_exit(void)

verwenden und nicht
Code:
module_init

In deinem Quellcode fehlt am Ende auch noch der Aufruf von

Code:
module_init(name_deiner_init_funktion);
module_exit(name_deiner_exit_funktion);

damit der Kernel weiss, welche Funktionen er für die Initialisierung und Beenden aufrufen muss.
 
OP
D

drewle

Newbie
Hallo,
danke für die vielen Antworten.

Die Ausgabe von "uname -r"
Code:
2.6.31.5-0.1-desktop
Die Ausgabe von "rpm -qa | grep kernel"
Code:
kernel-default-devel-2.6.31.8-0.1.1.x86_64
linux-kernel-headers-2.6.31-3.4.noarch
kernel-docs-2.6.3-44.4.noarch
kernel-default-2.6.31.8-0.1.1.x86_64
kernel-desktop-2.6.31.5-0.1.1.x86_64
kernel-firmware-20090821-4.1.noarch
kernel-source-2.6.31.8-0.1.1.noarch
kernel-default-base-2.6.31.8-0.1.1.x86_64
kernel-source-vanilla-2.6.31.8-0.1.1.noarch
kernel-source-rt-2.6.31-3.4.noarch

Die Compileroption "-I/usr/src/linux/arch/x86/include/" habe ich auch mal eingebaut. Soweit ich sehe hat der Compiler kein Problem mehr mit den Pfaden. Allerdings bekomme ich als erstes folgende Fehlermeldung:
Code:
/usr/src/linux/arch/x86/include/asm/current.h:12: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘struct’
(Es sind sehr viele Fehlermeldungen, darum will ich nicht alle Posten...)
In current.h steht in Zeile 12:
Code:
static __always_inline struct task_struct *get_current(void)
anscheinend erkennt er "__always_inline" inline nicht.

Noch eine Anmerkung: Das ist das erste kleine Beispiel aus dem Buch "Linux Gerätetreiber" von O'Reilly. Das ist mit Sicherheit sehr stark vereinfacht und soll auch nur eine kurze Ausgabe auf dem Terminal machen. Danke für den Hinweis wie's richtig geht. Es sollte aber so funktionieren, oder?

danke,
Drewle
 

spoensche

Moderator
Teammitglied
Du verwendest den 2.6.31.5-0.1-desktop Kernel und hast aber weder die Kernel-Syms noch das kernel-desktop-devel Paket für diesen Kernel installiert. Das Paket kernel-headers, was du installiert hast, ist für eine andere Kernel Version.

Dann wird das auch nicht funktionieren. Du musst die Pakete für den von dir verwendeten Kernel installieren, also kernel-desktop-devel-2.6.31.5-0.1, kernel-syms etc.
 
OP
D

drewle

Newbie
Danke Spoensche,
gibt es eine Liste mit allen Packeten, die man benötigt. Ich habe jetzt alle installiert, welche auf meiner CD mit drauf sind und die passende Version haben. Leider hab ich immer noch die Fehlermeldung.

Fehlen kann aber eigentlich auch nicht wirklich was, sonst müßte ja bei einem Include die Fehlermeldung kommen und nicht mitten im Code.

Drewle
 
spoensche schrieb:
Du musst die Pakete für den von dir verwendeten Kernel installieren, also kernel-desktop-devel-2.6.31.5-0.1, kernel-syms etc.

...und den aktuellen Kernel aus 'update'. Hin und wieder sollte man schon eine systemweite Aktualisierung einfahren, dann hat man auch weniger Schwierigkeiten, die passenden Versionen zusammenzustellen.
 
Appleonkel schrieb:
Beim Übersetzen bekomme ich jetzt den Fehler
make und gcc ist installiert.
In file included from /usr/src/linux/include/linux/list.h:6
Code:
rpm -qf /usr/src/linux/include/linux/list.h
kernel-source-2.6.31.8-0.1.1.noarch
Ist damit auch installiert ...
Es fehlt bloss eine Compileroption
Code:
gcc -I/usr/src/linux/arch/x86/include/ ...
Bloß? Wer so kompiliert und die Bücher der letzten drei Jahre ignoriert, wird ja sehen, wo er hinkommt.
 
Oben