Red de conocimiento del abogados - Preguntas y respuestas jurídicas - Cómo solucionar el módulo que no se pudo inicializar

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.

[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 /* Necesario porque usamos el proc fs */

#define procfs_name "proctest"

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