Cómo solucionar el módulo que no se pudo inicializar
La primera vez que cargué el módulo del controlador que compilé en la placa de desarrollo, ocurrió un problema. Afortunadamente, no tomó mucho tiempo. Los siguientes problemas y soluciones se enumeran a continuación.
1. : Insmod: error al insertar 'hello.ko': -1 Formato de módulo no válido
Método 1 (en línea): se debe a que el entorno generado por el módulo del kernel no es coherente con el entorno de ejecución. Es posible que los módulos generados a partir del código fuente no se carguen en el entorno Linux del kernel linux-2.6.32.2, pero deben cargarse en el entorno Linux del kernel linux-2.6.27.
a. Ejecute uname -r //Verifique la versión del kernel
b. Generalmente la información del error se registra en el archivo /var/log/messages. información de error
p>
# cat /var/log/messages |tail
Si aparece algo similar a lo siguiente:
4 de junio 22: 07:54 kernel localhost: hola: la versión magic '2.6 .35.6-45.fc14.i686.PAE
' debería ser '2.6.35.13-92.fc14.i686.PAE'
Luego cambie el KDIR en Makefile:=/lib /modules/2.6.35.6-45.fc14.i686.PAE/build1 cambiado a
KDIR :=/lib/modules/2.6.35.13-92 .fc14.i686.PAE/build1 //Cambiado a la ruta del código fuente de su propio kernel
(build1 aquí hay un enlace de archivo, vinculado a /usr/src/kernels/2.6.35.6-45.fc14. i686.PAE y 13-92)
Sin embargo, no hay 2.6.35.13-92.fc14.i686.PAE en mi fedora 14 /usr/src/kernels, solo 2.6.35.13-92.fc14 .i686, aunque no sé cuáles son los dos. Hay una diferencia, pero cambiarlo a 2.6.35.13-92.fc14.i686 sigue sin funcionar. Afortunadamente, me inspiré después. viendo el video de enseñanza
Método 2: la posición cambiada sigue siendo la misma
KDIR:=/opt/FriendlyARM/linux-2.6.32.2 //Cambie esto a la ruta donde compilé y generé el kernel
todos:
$ (MAKE) - C $ (KDIR) M = $ (PWD) módulos ARCH=arm CROSS_COMPILE=arm-linux- //Agregar esta oración
2. [70685.298483] hola: la licencia del módulo 'no especificada' contamina el kernel. p>
[70685.298673] Deshabilitar la depuración de bloqueo debido a la contaminación del kernel
Método: Agregue: MODULE_LICENSE("GPL");
3. rmmod: chdir( 2.6.32.2-FriendlyARM): No existe tal archivo o directorio Solución de error
Método: lsmod puede ver la información del módulo
Es decir, el módulo correspondiente no se puede eliminar.
Es decir, debe crear el directorio correspondiente para el mensaje de error ((2.6.32.2) en /lib/modules).
Se debe crear un directorio vacío como /lib/modules/2.6.32.2; de lo contrario, el módulo ko no se puede desinstalar.
# rmmod nls_cp936
rmmod : chdir(/ lib/modules): No existe tal archivo o directorio
Pero puedes desinstalar nls_cp936 de esta manera, pero siempre habrá un mensaje como éste:
rmmod: module ' nls_cp936' no encontrado
Inicialmente se descubrió que este es un directorio generado usando make module_install al compilar el kernel.
Sin embargo, después de las pruebas, se encontró que rmmod: module ' nls_cp936' no encontrado proviene de ocupadobox, no del kernel
1). Cree un directorio vacío /lib/modules/2.6.32.2
2). para generar el comando rmmod y puede desinstalar el módulo ko sin ningún mensaje [luther .gliettl.h>
#include
#include
int main(int argc, char *argv[ ])
{
const char *modname = argv[1];
int ret = -1;
int maxtry = 10;
mientras (maxtry-- > 0) {
ret = eliminar_módulo(modname, O_NONBLOCK | O_EXCL);// Llamada al sistema sys_delete_module
if (ret < 0 && errno == EAGAIN)
usleep(500000);
else
break;
}
if (ret != 0)
printf("No se puede descargar el módulo del controlador \"%s\": %s\n",
modname, strerror(errno ));
}
3). Copie el comando generado al sistema de archivos
# arm-linux-gcc -static -o rmmod rmmod.c
# arm-linux-strip -s rmmod
# cp rmmod /nfs/
cp /nfs/rmmod /sbin
El código es el siguiente:
proc.c
[html] ver copia simple
#include
#include
# include
#include
#define procfs_name "proctest" p>
MODULE_LICENSE("GPL");
cadena
uct proc_dir_entry *Nuestro_Proc_File;
int procfile_read(char *buffer,char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)
{ int ret; /p>
ret = sprintf(buffer, "HelloWorld!\n");
return ret
}
int proc_init()
{ Nuestro_Proc_File = create_proc_entry(procfs_name, 0644, NULL);
if (Our_Proc_File == NULL) {
remove_proc_entry(procfs_name, NULL); >
printk(KERN_ALERT "Error: No se pudo inicializar /proc/%s\n",procfs_name);
return -ENOMEM }
Our_Proc_File->read_proc = procfile_read; ;//
// Nuestro_Proc_File->propietario = ESTE_MODULE;
Nuestro_Proc_File->modo = S_IFREG |
Nuestro_Proc_File->uid = 0; /p>
Nuestro_Proc_File->gid = 0;
Nuestro_Proc_File->tamaño = 37;
printk("/proc/%s creado\n", procfs_name);
devolver 0;
}
void proc_exit()
{ remove_proc_entry(procfs_name, NULL
printk(KERN_INFO "/proc/%s eliminado\n", procfs_name);
}
module_init(proc_init
module_exit(proc_exit);
[html] ver copia simple
ifneq ($(KERNELRELEA
SE),)
obj-m :=proc.o
else
KDIR :=/opt/FriendlyARM/linux-2.6.32.2
#KDIR :=/lib/modules/2.6.35.13-92.fc14.i686.PAE/build1
PWD :=$(shell pwd)
todos:
$(MAKE) -C $(KDIR) M=$(PWD) módulos ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif
Genere proc.ko después de make y luego insmod proc.ko en la placa de desarrollo
Ejecute dmesg para ver la información del kernel generada