2012-02-29 23 views
10

Estoy tratando de compilar un ejemplo de "hello world" Kernel Module, problemas encontrados en ubuntu 11.04, kernel 3.2.6, gcc 4.5.2 y fedora 16, kernel 3.2.7, gcc 4.6.7.compilación de módulos: asm/linkage.h archivo no encontrado

código:

#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); 

compilado con:

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

error:

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

entonces me encontré en/usr/src/linux/include/no hay ninguna carpeta llamada 'asm' pero 'asm-genérico'; así que hice un enlace blando 'asm' a 'asm-generic', y compilado agail:

esta vez fue el error:

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

Entonces me di cuenta de que estaba equivocado, pero ¿por qué? T_T

Respuesta

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 

es una manera adecuada de construir módulos ver kbuild documentation

y para ver diferencia beetween su invocación del compilador se podía

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

y analizar una salida del módulo

1

asm debe ser un enlace a la arquitectura real para la que está compilando, no al asm-generic.
No se puede compilar un módulo kernel genérico, que funcionaría en una arquitectura genérica. Debe compilarlo para la arquitectura particular que va a usar.

No sé por qué el asm no existe. Se debe crear como parte del proceso de configuración.
Es posible que obtenga otros errores más adelante, si la configuración está incompleta de otras maneras.

+0

tengo que revisar las carpetas del núcleo src (3.2+) de 3 máquinas con Ubuntu, Fedora y gentoo, ninguno de ellos contiene la carpeta 'asm'. Así que creo que no es un error ... –

+2

En el Redhat que revisé, '/ usr/src/kernels /.../includes/asm' es un enlace 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 

Aquí hello.c es su archivo fuente del kernel. solo use make para construir su módulo hello.ko.

+3

sé que esto podría funcionar, pero ¿por qué no funciona a mi manera? "gcc -D__KERNEL__ -I/usr/src/linux/include/-DMODULE -Wall -O2 -c hello.c -o hello.o" –

-1

compilar: archivo asm/linkage.h no encontrado

Esto significa que este archivo en particular no se encontró en DIR especificado, que se especifica cuando usamos la opción -I con make.

Podemos vincular ese asm-generic a asm, si todos los encabezados están presentes en asm-generic, o podemos usar make utility.

Hacer la utilidad es preferible en caso de construir módulos de kernel.

Cree un 'Makefile' en DIR de trabajo.

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 

El uso de la opción -C cambiará a DIR especificada antes de leer los makefiles o hacer cualquier otra cosa.

Así que para evitar este error, utilice la opción -C con DIR /lib/modules/$(shell uname -r)/build

Mediante este programa será capaz de encontrar los archivos necesarios, obtendrá hello.ko archivo.

Puede añadir esto a los módulos del núcleo por

sudo insmod hello.ko 

mismo modo se puede eliminar por

sudo rmmod hello 
Cuestiones relacionadas