Red de conocimiento informático - Conocimiento informático - Cómo compilar un módulo de controlador en Linux

Cómo compilar un módulo de controlador en Linux

Este artículo registra el proceso de compilación de mi primer controlador de dispositivo Linux. Soluciones a los problemas encontrados.

Entorno: kernel 2.4.18-14, código fuente del kernel de Linux: 2.4.18.

Ruta del código fuente del kernel de Linux: /usr/src/linux (este código fuente es la versión 2.4.18 descargada del sitio web kernel.org)

Según la "Explicación detallada de Linux Desarrollo de controladores de dispositivos" Los pasos del libro implementan el ejemplo clásico "¡Hola, mundo!".

Los pasos específicos son los siguientes:

============================ = ==============

1. El código fuente es el siguiente:

/*

* hola. c -- el ejemplo de printf "¡hola mundo!" en la pantalla del programa controlador

*/

#include

#include

MODULE_LICENSE("Dual BSD/GPL");/* declarar la licencia del módulo, es necesaria */

static int hello_init (void)

{

printk(KERN_ALERT "¡Hola mundo, entra!\n");

devuelve 0;

}

static int hello_exit(void)

{

printk(KERN_ALERT "¡Hola mundo, salida!\n");

}

module_init (hello_init); /* cargar el módulo */

module_exit(hello_exit); /* descargar el módulo */

Ingrese al directorio:

[root@ Alex_linux /]#cd /work/jiakun_test/moduletest

[root@Alex_linux moduletest]# vi hello.c

Luego copie el código fuente en el libro anterior.

2. Compile el código:

1>. Primero, lo compilé en una máquina virtual con kernel 2.4. El proceso de compilación es el siguiente:

. [root@Alex_linux moduletest ]#gcc -D__KERNEL__ -I /usr/src/linux -DMODULE -Wall -O2 -c -o hello.o hello.c

La opción -I especifica el código fuente en línea , que es la ruta del árbol de fuentes del núcleo.

Resultado de la compilación:

hello.c:1:22: net/sock.h: No existe tal archivo o directorio

hello.c: En función `hello_init':

hello.c:6: advertencia: declaración implícita de la función `printk'

hello.c:6: `KERN_ALERT' no declarado (primer uso en esta función)

hola .c:6: (Cada identificador no declarado se informa solo una vez

hello.c:6: para cada función en la que aparece).

hello.c:6: error de análisis antes constante de cadena

hello.c: En función `hello_exit':

hello.c:11: `KERN_ALERT' no declarado (primer uso en esta función)

hello.c:11: error de análisis antes de la constante de cadena

hello.c: en el nivel superior:

hello.c:13: advertencia: el tipo predeterminado es `int' en la declaración de `module_init'

hello.c:13: advertencia: nombres de parámetros (sin tipos) en la declaración de función

hello.c:13: advertencia: la definición de datos no tiene tipo ni clase de almacenamiento

hello.c:14: advertencia: el tipo predeterminado es `int' en la declaración de `module_exit'

hello.c:14: advertencia: nombres de parámetros (sin tipos) en la función declaración

hello.c:14: advertencia: la definición de datos no tiene tipo ni clase de almacenamiento

Después de buscar en línea, algunos internautas sugirieron que kernel.h no se introdujo

Solución:vi hello.c

Agregue en la primera línea: #include

Compile nuevamente y aún así informe que KERN_ALERT no está declarado

Modificar la condición de compilación -I, compilar nuevamente:

[root@Alex_linux moduletest]#gcc -D__KERNEL__ -I /usr/src/linux -DMODULE -Wall -O2 -c -o hello .o hola.c

[root@Alex_linux moduletest]#ls

hello.c hola.o Makefile

[root@Alex_linux moduletest]#

2>. Luego intenté compilar en una máquina virtual con kernel 2.6

El proceso de compilación es el siguiente:

[root

@JiaKun moduletest]# ls

hello.c makefile

[root@JiaKun moduletest]# vi hello.c

[root@JiaKun moduletest]# make

make -C /mylinux/kernel/2.4.18-rmk7 M=/home/alex/test/moduletest module

make: *** /mylinux/kernel/2.4. 18-rmk7: No existe tal archivo o directorio. Detener.

make: *** [módulos] Error 2

[root@JiaKun moduletest]# vi makefile

[root@JiaKun moduletest]# make

make -C /usr/src/kernels/2.6.18-53.el5-i686 M=/home/alex/test/moduletest module

make[1]: Ingresando al directorio `/usr/src/kernels/2.6.18-53.el5-i686'

scripts/Makefile.build:17: /home/alex/test /moduletest/Makefile: No existe tal archivo o directorio

make[2]: *** No hay regla para hacer que el destino `/home/alex/test/moduletest/Makefile' se detenga.

make[1]: *** [_module_/home/alex/test/moduletest] Error 2

make[1]: Saliendo del directorio `/usr/src/kernels/2.6.18-53 .el5-i686'

make: *** [módulos] Error 2

[root@JiaKun moduletest]# mv makefile Makefile

[root@JiaKun moduletest]# make

make -C /usr/src/kernels/2.6.18-53.el5-i686 M=/home/alex/test/moduletest module

make[ 1]: Ingresando al directorio `/usr/src/kernels/2.6.18-53.el5-i686'

CC [M] /home/alex/test/moduletest/hello.o

Creación de módulos, etapa 2.

MODPOST

CC /home/alex/test/moduletest/hello.mod.o

LD [M] /home/alex/test/moduletest/hello.ko

make[1]: Saliendo del directorio `/usr/src/kernels/2.6.18-53.el5-i686'

[root@JiaKun moduletest]# ls

hola.c hola.k

o hello.mod.c hello.mod.o hello.o Makefile Module.symvers

3 Ejecute el código y cargue el módulo del controlador:

2.4 módulo de carga del kernel:

insmod ./hello.o

Pero la información impresa por printk no se genera en este momento. Sin embargo, puede ver la información impresa en /var/log/messages. Esto se debe a que la prioridad de KERN_ALERT no es lo suficientemente alta. Aquí

debe modificarse a: KERN_EMERG. Compile nuevamente y cargue el módulo para ver el resultado

Módulo de carga del kernel 2.6:

[root@JiaKun moduletest]# insmod hello.ko

[root@ Prueba del módulo JiaKun]#

Mensaje de syslogd@ el sábado 26 de julio a las 19:52:44 2008...

Núcleo de JiaKun: Hola mundo

Sí, amigos Puede haber un error que indica que no se puede encontrar el comando insmod. Esto puede deberse a las siguientes razones:

<1> Su sistema no tiene instalada la herramienta module-init-tools. Para este problema, simplemente instálela. Sí, pero generalmente existe este comando después de instalar el sistema.

<2>Este comando no se puede utilizar porque no se agrega la variable de entorno. Use echo $PATH para verificar la variable de entorno PATH y descubra que no hay una ruta /sbin, por lo que, por supuesto, no puede usar el comando insmod. La solución es simple, simplemente ingrese:

PATH = "$PATH:/sbin" en la línea de comando para agregarlo. (insmod está en el directorio /sbin, puedes usar Whereis insmod para verlo).

<3>El comando insmod requiere permisos de root para usarse.

Una vez completada la carga, puede ingresar lsmod para ver el módulo de saludo.

4. Desinstale el módulo del controlador: rmmod hola.

Después de cargar el módulo, podrá ver el siguiente mensaje en la pantalla: Hola mundo, ingrese.

Al desinstalar, podrá ver la siguiente información en la pantalla: hola mundo, salir.

[root@JiaKun moduletest]# rmmod hello.ko

[root@JiaKun moduletest]#

Mensaje de syslogd@ el sábado 26 de julio 19:52:58 2008...

Núcleo JiaKun: Adiós, mundo cruel

Además, si hay varios archivos, presione Escriba el Makefile (archivo1.c, archivo2.c) de la siguiente manera:

obj -m := modulename.o

module-objs := file1.o archivo2.o

p>