TSO Modulos
Módulos del kernel
TSO – Módulos- 2012
Módulos
• El kernel de Linux es modular ya que permite la inserción y
eliminación dinámica de código en el kernel en tiempo
de ejecución.
• Las subrutinas asociadas, datos, puntos de entrada y
salida son agrupadas en una única imagen binaria
llamada módulo del kernel.
• Para permitir esto, el kernel debe estar compilado conla
opción CONFIG_MODULES
• Cuando se agrega una nueva funcionalidad al kernel
siempre está la pregunta; Como módulo ? O estático en
el kernel ?
• Muchas veces los programadores tienden agregar
funcionalidades como módulos ya que se pueden cargar
a demanda.
TSO – Módulos- 2012
Módulos
• El kernel debe realizar dos grandes tareas con respecto a
los módulos:
– Asegurarse que el resto del kernelpueda acceder a los
símbolos globales del módulo y que el módulo pueda acceder
a los símbolos del kernel. Las referencias son resueltas en el
momento de carga del módulo.
– Llevar la cuenta del uso de módulos para que no se pueda
descargar un módulo mientras otra parte del kernel lo está
usando.
•
–
TSO – Módulos- 2012
Implementación de módulos
• Los módulos son guardados en el filesystem comoarchivos
objeto (con extensión .ko) y son linkeditados con el kernel
con el programa insmod.
• El sistema define la estructura struct module para
representar los módulos.
• Cada objeto module describe un módulo.
• Linux mantiene una lista doblemente encadenada que
agrupa todos los objetos module.
• La cabeza de la lista es guardada en la variable modules
mientras los punteros a los elementosadyacentes se
guardan en el campo list de cada module.
TSO – Módulos- 2012
Implementación de módulos
• El campo state puede tener los siguientes valores:
– MODULE_STATE_LIVE – El módulo está activo.
– MODULE_STATE_COMING – El módulo se está inicializando.
– MODULE_STATE_GOING – El módulo se está eliminando.
• Cada módulo tiene un conjunto de contadores (uno por
CPU) almacenado en el campo ref.
• Elcontador es incrementado cada vez que una función del
módulo se inicializa y decrementado cada vez que
finaliza.
• Un módulo puede ser descargado una vez que la suma de
los contadores de uso sea 0.
TSO – Módulos- 2012
Implementación de módulos
• Cuando se carga un módulo, todas las referencias a símbolos del
kernel deben ser resueltas. Esto lo realiza el comando insmod.
• Algunas tablas desímbolos especiales dentro del kernel son usadas
para guardar los símbolos accedidos por módulos junto con sus
correspondientes direcciones.
• Los módulos cargados pueden exportar sus símbolos así otros
módulos pueden accederlos.
• Un módulo A puede utilizar símbolos de un módulo B. Para cargar el
módulo A, B ya debe estar cargado.
• El campo modules_which_use_me del objeto module
correspondiente a A esla cabeza de la lista de dependencias de A.
Esta lista debe actualizarse dinámicamente cuando se carga un
módulo que usa A.
• El módulo A no puede descargarse si su lista de dependencias no es
vacía.
•
TSO – Módulos- 2012
Carga de módulos del kernel
•
En la carga del módulo se realizan las siguientes
operaciones:
1.
2.
3.
4.
5.
•
Lee de la línea de comando el nombre de módulo a cargar.Busca el archivo que implementa el módulo (/lib/modules).
Lee de disco el archivo que contiene el código del módulo.
Invoca a la syscall init_module() pasándole:
• El buffer de usuario conteniendo el código objeto del módulo.
• El largo del código.
• El área de memoria conteniendo los parámetros (user mode).
Termina.
La mayor parte del trabajo real es sys_init_module().
TSO – Módulos- 2012
Cargade módulos del kernel
1.
2.
3.
4.
5.
6.
7.
Verifica que el usuario tenga permisos de cargar módulos.
Reserva memoria temporal para los buffers pasados como
parámetro a la syscall (y copia la información).
Busca en la modules_list que el módulo no se encuentre ya
cargado.
Reserva memoria para la porción ejecutable del código y el área
de inicialización del mismo (y copia la información).
Guarda...
Regístrate para leer el documento completo.