2012-02-29 38 views
10

Sto cercando di compilare un esempio di modulo Kernel "hello world", problemi trovati su ubuntu 11.04, kernel 3.2.6, gcc 4.5.2 e fedora 16, kernel 3.2.7, gcc 4.6.7.: asm/linkage.h file non trovato

codice:

#include <linux/module.h> 
#include <linux/init.h> 
MODULE_LICENSE("GPL"); 

static int __init hello_init (void) 
{ 
printk("Hello module init\n"); 
return 0; 
} 
static void __exit hello_exit (void) 
{ 
printk("Hello module exit\n"); 
} 
module_init(hello_init); 
module_exit(hello_exit); 

compilato con:

gcc -D__KERNEL__ -I /usr/src/linux/include/ -DMODULE -Wall -O2 -c hello.c -o hello.o 

errore:

In file included from /usr/src/linux/include/linux/kernel.h:13:0, from /usr/src/linux/include/linux/cache.h:4, from /usr/src/linux/include/linux/time.h:7, from /usr/src/linux/include/linux/stat.h:60, from /usr/src/linux/include/linux/module.h:10, from hello.c:1: /usr/src/linux/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: file not found

poi ho trovato in/usr/src/linux/include/non ci si chiama alcuna cartella "asm" ma "asm-generic"; così ho fatto un soft link 'asm' a 'asm-generica', e compilati agail:

questa volta l'errore è stato:

In file included from /usr/src/linux/include/linux/preempt.h:9:0, from /usr/src/linux/include/linux/spinlock.h:50, from /usr/src/linux/include/linux/seqlock.h:29, from /usr/src/linux/include/linux/time.h:8, from /usr/src/linux/include/linux/stat.h:60, from /usr/src/linux/include/linux/module.h:10, from hello.c:1: /usr/src/linux/include/linux/thread_info.h:53:29: fatal error: asm/thread_info.h: file not found

Così ho capito che mi sbagliavo, ma perché? T_T

risposta

7
obj-m += hello.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

è un modo corretto per costruire moduli vedere kbuild documentation

e di vedere la differenza beetween vostra invocazione compilatore si potrebbe

cat /lib/modules/$(shell uname -r)/build/Makefile 

e analizzare un'uscita modulo

1

deve essere un collegamento all'architettura effettiva per la quale si sta compilando, non a asm-generic.
Non è possibile compilare un modulo kernel generico, che funzionerebbe su un'architettura generica. Devi compilarlo per la particolare architettura che stai per utilizzare.

Non so perché il asm non esistesse. Dovrebbe essere creato come parte del processo di configurazione.
Potresti ricevere altri errori in seguito, se la configurazione è incompleta in altri modi.

+0

Ho controllare le cartelle kernel src (versione successiva alla 3.2) su 3 macchine con Ubuntu, Fedora e gentoo, tutti loro non contengono la cartella 'asm'. Quindi penso che potrebbe non esserci un errore .. –

+2

Nel Redhat che ho controllato,/usr/src/kernel /.../ include/asm' è un collegamento a 'asm-x86_64'. – ugoren

2
obj-m += hello.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

Qui hello.c è il file sorgente del kernel. usa make per compilare il tuo modulo hello.ko.

+3

so che questo potrebbe funzionare, ma perché non funziona a modo mio? "gcc -D__KERNEL__ -I/usr/src/linux/include/-DMODULE -Wall -O2 -c ciao.c -o ciao.o" –

-1

compilazione: asm/linkage.h file non trovato

Ciò significa che questo particolare file non è stato trovato nella DIR specificata, che viene specificata quando si utilizza l'opzione -I con make.

sia Possiamo creare un collegamento che asm-generic ad ASM, se tutte le intestazioni sono presenti in asm-generica, oppure possiamo utilizzare l'utilità make.

L'utilità di creazione è preferibile in caso di moduli del kernel di costruzione.

Creare un "Makefile" nel funzionamento DIR.

obj-m += hello.o 
all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

Uso opzione -C del cambierà DIR specificato prima di leggere i makefile o fare qualsiasi altra cosa.

Quindi, per evitare questo errore, utilizzare l'opzione -C con DIR /lib/modules/$(shell uname -r)/build

Con questo il programma sarà in grado di trovare i file richiesti, si otterrà hello.ko file.

È possibile aggiungere questo al kernel i moduli da

sudo insmod hello.ko 

Allo stesso modo è possibile rimuovere dal

sudo rmmod hello