Академический Документы
Профессиональный Документы
Культура Документы
Table of Contents
Prctica 2. Mdulos del ncleo..........................................................................................................................1
2.1 Introduccin.......................................................................................................................................1
2.2 Los mdulos cargables en Linux.......................................................................................................1
2.3 Programacin de los mdulos............................................................................................................2
2.4 Utilizacin de los mdulos................................................................................................................3
2.5 Tarea a realizar...................................................................................................................................4
2.6 Comprobacin del funcionamiento....................................................................................................5
2.1 Introduccin
Podis guardar vuestros ficheros en discos flexibles, ya que slo es necesario conservar de una sesin
a otra los ficheros fuente que hayis modificado, no el resto de ficheros del ncleo, ni ejecutables, ni
ficheros objeto (.o). Los ficheros modificados siempre sern de un tamao perfectamente manejable.
Para manejar los disquetes podis montarlos con la orden mount(8) o bien usar las "mtools":
mdir(1), mformat(1), mcopy(1), mdel(1), etc.
Recordad siempre borrar todo antes de apagar la mquina.
Los mdulos son "trozos de sistema operativo", en forma de ficheros objeto (.o), que se pueden insertar y
extraer en tiempo de ejecucin. Dichos ficheros .o se pueden obtener directamente como resultado de la
compilacin de un fichero .c (gcc c prog.c), o como la unin de varios ficheros .o (ld r
f1.o f2.o). La nica caracterstica especial que deben tener estos ficheros, es la de incorporar las
funciones init_module y cleanup_module. Ms adelante veremos su utilidad.
Prctica 2. Mdulos del ncleo
Como quiera que el cdigo de un mdulo puede utilizar cualquier funcin del ncleo, pero no ha sido
enlazado en tiempo de compilacin con l, las referencias a las funciones del ncleo no estn resueltas. As
pues, el proceso de insercin de un mdulo debe seguir una serie de pasos:
1. Obtener las referencias a funciones ofrecidas por el mdulo.
2. Incorporar dichas referencias al ncleo, como referencias temporales (desaparecern con la extraccin
del mdulo).
3. Resolver las referencias a las funciones no resueltas en el mdulo, ya sean a funciones del ncleo,
como a funciones de otro mdulos.
4. Insertar el mdulo en la zona de memoria correspondiente al ncleo.
5. Finalmente, invocar a la funcin init_module del nuevo mdulo.
La extraccin de un mdulo del ncleo se realiza mediante una secuencia similar a la anterior, pero en orden
inverso, donde antes de extraer el mdulo se invoca a la funcin cleanup_module.
El ncleo no dispone de salida estndar, por lo que no podemos utilizar la funcin printf(). A cambio, el
ncleo ofrece una versin de sta, llamada printk(), que funciona casi igual, a excepcin de que el
resultado lo imprime sobre un buffer circular de mensajes (kernel ring buffer).
En el kernel ring buffer es donde se escriben todos los mensajes del ncleo. De hecho, son los mensajes que
vemos cuando arranca Linux. En cualquier momento podemos ver su contenido reciente con la orden dmesg
o su contenido inmediato consultando el fichero /proc/kmsg.
El manejo de los mensajes por el kernel es muy flexible y algo complejo (ver klogd(8) y
/usr/src/linux/include/linux/kernel.h). Concretamente, los primeros 3 caracteres de los
mensajes impresos a travs de printk deben ser <n>, donde n es un nmero entre 0 y 7, ambos inclusive.
KERN_EMERG
KERN_ALERT
KERN_CRIT
KERN_ERR
KERN_WARNING
KERN_NOTICE
KERN_INFO
KERN_DEBUG
System is unusable
Action must be taken immediately
Critical conditions
Error conditions
Warning conditions
Normal but significant condition
Informational
Debuglevel messages
Normalmente, el ncleo est configurado para mostrar por la consola activa los mensajes de prioridad superior
a 6. (Los terminales grficos no son consolas, a no ser que se hayan lanzado explcitamente como tales).
Para pasar parmetros a un mdulo, no hay ms que asignar valores a las variables globales declaradas como
parmetros con la macro MODULE_PARM. Como hemos visto en el programa de ejemplo, MODULE_PARM
recibe como primer argumento el nombre de la variable y como segundo argumento, el tipo. Ms
concretamente:
El tipo debe ser una cadena con el formato [min[max]]{b,h,i,l,s}.
Si aparecen, min y max indican el mnimo y mximo nmero de elementos, del tipo indicado despus, que,
separados por comas, pueden asignarse a la variable (que ser entonces un vector). El carcter final indica el
tipo de la variable o vector segn la tabla:
b byte
h short
i int
l long
s string
El mdulo acumulador debe definir una funcin void acumular(int i), que reciba un parmetro
entero y vaya sumando su valor a una variable global. Esta funcin debe ser exportable (en C, toda funcin no
static es exportable).
El mdulo acumulador tambin debe ofrecer una funcin int llevamos(void), que devuelva cunto
lleva acumulado.
El mdulo cliente, al ser insertado, debe llamar a la funcin acumular() del mdulo acumulador
con un valor a acumular igual al parmetro que le pasemos al mdulo cliente al insertarlo.
El mdulo cliente, al ser extraido, debe llamar a la funcin llevamos() del mdulo acumulador e
imprimir el resultado en su mensaje de salida.
El mdulo acumulador, al ser extraido, tambin debe imprimir el resultado final de la suma en su mensaje
de salida.