PRÁCTICA 6

 

 CARGAR MÓDULOS

 

OBJETIVOS

 

·       Aprender los comandos de manejo de módulos

·       Aprender los parámetros de configuración del núcleo para manejo de módulos

·       Diseñar e implementar un manejador como módulo cargable

 

 

TRABAJO

 

·       Compilar el núcleo con los parámetros de configuración que permiten trabajar con módulos.

 

·       Estudiar los comandos de manejo de módulos insmod, lsmod, y rmmod.

 

·       Diseñar e implementar un nuevo manejador de dispositivo como módulo cargable.

 

·       Diseñar las funciones de entrada salida que trabajan con el manejador.

 

·       Diseñar la función de inicio del manejador

 

·       Diseñar la función de descarga del manejador

 

 

DOCUMENTA-CION

 Remi Card, capitulo de modulos.

Notas del profesor

TIEMPO

2 Horas

 

 

 

CARGAR MÓDULOS

 

1.     Compilar el núcleo con los parámetros de configuración que permiten trabajar con módulos.

 

*

* Loadable module support

*

Enable loadable module support (CONFIG_MODULES) [Y/n/?] Y

 

2.     Diseñar e implementar un manejador como módulo cargable.

 

2.1 Definir número mayor y menor para el dispositivo

#define manejador_MAYOR nn

#define manejador_MINOR  xx

 

2.2 Definir operaciones de entrada salida para el dispositivo

 

static   int   manejador_fs_read (struct  inode  *inode, struct  file  *file,

                                                                 char *buf, int  nbytes );

 

2.4 Definir la estructura  file_operations

 

static struct  file_operations  manejador_fops =

{

          NULL,

          manejador_fs_read,

          NULL,

NULL,

NULL,

NULL,

NULL,

NULL,

NULL,

NULL

};

 

2.5 Diseñar la función de inicialización del modulo y descarga

 

int  manejador_init (void)

{

.....

}

 

#ifdef MODULE

/* función de inicio del modulo */

int init_module (void)

{

          return manejador_init ();

}

 

/* Función de descarga del módulo */

void cleanup_module (void)

{

unregister_chardev (mayor device, “manejador”);

printk (“manejador modulo no se puede descargar \n”);

}

 

#endif

 

2.6 Diseñar la función de lectura del manejador

 

static int manejador_fs_read (struct inode *inode, struct file *file, char *buf, int nbytes)

{

...

}

 

3.     Compilar el modulo con las directivas D__KERNEL__  y DMODULE

 

4.     Crear el archivo especial para este manejador.

#mknod /dev/manejador    c   mayor_device   menor_device

 

5.     Insertarlo en el núcleo.

 

#insmod  manejador

 

6.     Ver lista de módulos cargados.

#lsmod

 

7.     Utilizarlo

 

8.     Quitarlo del núcleo.

 

#rmmod  manejador

 


 

 

MÓDULOS DEL NÚCLEO

 

Hay componentes del núcleo que siempre tienen que estar en memoria como el planificador de la CPU.

 

Sin embargo otros componentes solo tienen que estar en memoria cuando se  necesitan, como el manejador de un CDWriter; un sistema de ficheros Minix, NFS; un manejador de protocolo PPP.

 

Estas partes del núcleo que pueden cargarse o descargarse dinámicamente en memoria, mientras el núcleo se esta ejecutando se llaman MÓDULOS.

 

Ventajas de los módulos

 

La incorporación de nuevos manejadores al núcleo es mas fácil, se pueden compilar, cargar, probar, o quitar como módulos antes de integrarlos en le núcleo.

 

Si el manejador está integrado en el núcleo, cada vez que hagamos modificaciones en el manejador hay que recompilar todo el núcleo y reiniciar.

 

El núcleo no ocupa tanta memoria principal, quedando libre para las aplicaciones.

 

Desventajas

 

Cada vez que se requiere o ya no se necesita un módulo hay que pagar el coste de leer o escribir en disco.

 

El código del núcleo se incrementa con el sistema de manejo de módulos.

 

 

La opción que activa que el núcleo maneje los módulos es:

 

Enable loadable module suport (CONFIG_MODULES) [Y/n/?]

 

Si se desea instalar un componente como módulo, hay que declararlo en la configuración del núcleo, ejemplo instalar el sistema de ficheros MSDOS.

 

DOS FAT fs support (CONFIG_FAT_FS) [M/n/y/?]  M

MSDOS fs support (CONFIG_MSDOS_FS) [M/n/y/?] M

VFAT (Windows-98) fs support (CONFIG_VFAT_FS) [m/n/y/?] M

 

Una vez compilado el núcleo se compilan los módulos, la secuencia puede ser:

 

make config

make dep

make clean

make zImage

make modules

make modules_install

 

finalizado este proceso, los módulos se encuentran el /lib/modules.

 

Los módulos se compilan como cualquier programa pero son enlazados como imágenes recargables, esto es no están asociadas a ninguna dirección.

 

Podemos ver los símbolos exportados por el núcleo en /proc/ksyms o utilizando el comando ksyms.

 

Cada módulo debe contener unos procedimientos que los manejan, incluyendo uno de inicialización cuando se carga el módulo y otro de borrado cuando se quita del núcleo.

 

 

Los comandos del super usuario para manejar manualmente los módulos son:

 

 

 

ejemplo de listado al ejecutar lsmod

 

Module:                  #pages:                 Used by:

msdos                              2                            1 (autoclean)

vfat                                  4                            1 (autoclean)

fat                                   6        [vfat msdos] 2 (autoclean)

 

 

 

Carga automática de módulos por demanda del núcleo

 

Cuando se monta un sistema de ficheros que no está integrado en el núcleo, el núcleo solicita al programa kerneld que cargue los módulos necesarios para este sistema de ficheros montado.

 

La carga dinámica y automática de módulos precisa que se compile el núcleo con la opción CONFIG_KERNELD y los IPC System V.

 

Se precisa al arrancar el sistema lanzar el programa demonio kerneld, que lee las peticiones del núcleo y realiza la carga o descarga de los módulos necesarios. Se ejecuta como un proceso de usuario y establece un canal de comunicación basado en mensajes  (IPC) con el núcleo, por el cual el núcleo solicita mediante mensajes un modulo al programa modprobe.

 

se utilizan los programas depmod y modprobe.

 

DEPMOD, genera un archivo de dependencias de los símbolos encontrados en los módulos.

 

MODPROBE,  es el programa para manejo de módulos, requiere privilegios de root.

 

Los procedimientos del núcleo que interaccionan con modprobe y la estructura de datos principal, (se encuentran en include/linux/module.h y kernel/module.c) son:

 

 

Es la función llamada por el núcleo cuando este percibe, por la solicitud de un proceso, la necesidad de cargar un módulo.

 

 

Es el programa que añade el módulo solicitado al núcleo, es llamado por kerneld.

 

 


 

 

 

Los ficheros que tratan con los módulos son:

 

incluye/linux/module.h

 

kernel/module.c

 

contienen la estructura struc module

 

 y las llamadas al sistema utilizadas por modprobe y los comandos insmod, lsmod y rmmod son:

 

sys_create_module

sys_init_module

sys_delete_module

sys_get_kernel_syms