190 likes | 319 Views
Esteve Llobera i Vila Edgar Gonzàlez i Pellicer. Càrrega dinàmica de mòduls al kernel de Linux. Què és un mòdul de Linux?. Són fragments de codi precompilat que poden ser enllaçats dinàmicament dins el kernel de Linux en temps d’execució. KERNEL. MÒDUL. MÒDUL. HD. MÒDUL. MÒDUL.
E N D
Esteve Llobera i Vila Edgar Gonzàlez i Pellicer Càrrega dinàmica de mòduls al kernel de Linux
Què és un mòdul de Linux? • Són fragments de codi precompilat que poden ser enllaçats dinàmicament dins el kernel de Linux en temps d’execució. KERNEL MÒDUL MÒDUL HD MÒDUL MÒDUL
Què és un mòdul de Linux? • Els seus usos inclouen • Controladors de dispositiu (drivers) • Controladors de sistemes de fitxers • Crides a sistema addicionals o no estàndard • Implementació de protocols de xarxa • Interpret de diversos formats d’executables • Control de línies de terminal • Té la mateixa filosofia que els sistemes extensibles!
Per què els mòduls de Linux? • Linux és un sistema amb estructura monolítica i per tant cada vegada que necessitèssim adaptar el kernel hauriem de recompilar-lo. • Solucions: carrega dinàmica de mòduls que ofereixin les funcionalitats desitjades. • Ventatges addicionals: • No cal apagar el sistema • La memòria utilitzada pel nucli és més petita • Contrapartida: • Lleugera pèrdua d’eficiència.
Història i evolució • Van aparèixer a la versió 1.2 del kernel (1995) • A partir de llavors es van anar extraient del kernel tots els fragments que poguessin ser modularitzats. Aquesta feina no es va acabar fins l’any 2000. vFat audio eth Kernel IPX ELF ...
Estructures que els suporten • La llista de mòduls del kernel presenta aquest format:
Estructures que els suporten • El primer element de la llista de mòduls és un pseudo-mòdul encarregat de mantenir la taula de símbols exportats pel kernel base. • A partir d’aquest s’enllacen tots els altres mòduls en ordre d’inserció.
Operacions amb els mòduls • Inserció d’un mòdul: • El mòdul es troba compilat a disc en un fitxer objecte. • El programa carregador ubica el codi del mòdul en memòria del kernel substituint les referències externes del mòdul, per les adreces dels corresponents símbols del kernel. • S’actualitza la taula de símbols del kernel amb els nous símbols oferts pel mòdul. • Es crida a la rutina init_module() del mòdul. Aquesta crida haurà de registrar els serveis oferts pel mòdul mitjançant rutines internes del kernel. Cal recordar que el mòdul forma part del kernel.
Operacions amb els mòduls • Extirpació d’un mòdul: • Cal verificar que el mòdul a extirpar no sigui utilitzat per cap altre mòdul. Ho podem comprovar a la taula de referències del mòdul. • Es desregistren tots els símbols que exportava el mòdul de la taula de símbols del kernel. • Es crida a la rutina cleanup() del mòdul que desenregistrarà els serveis que oferia al kernel. • S’eliminen les referencies als mòduls de què depenia. • S'allibera la memòria de sistema que utilitzava.
Eines estàndard per la gestió de mòduls • Linux ofereix un paquet anomenat modutils per a la gestió dels mòduls. Aquest paquet inclou: • lsmod: llista tots els mòduls carregats actualment al sistema. • depmod: genera l’arbre de dependències de tots els mòduls seleccionats a l’última compilació del kernel. • modprobe: agrega un nou mòdul al kernel comprovant les seves dependències. • insmod: agrega un nou mòdul al kernel sense comprovar dependències. • rmmod: descarrega un mòdul del kernel. • I d’altres: ksyms, modinfo, etc.
Càrrega automàtica de mòduls: kerneld • A la versió 1.3 del kernel Bjorn Ekwall va introduir el Kernel Daemon (kerneld), al paquet modutils. • Kerneld és un procés d’usuari que en iniciar-se obre un canal de missatges IPC amb el kernel. Els missatges tenen l’estructura:struct kerneld_msg { long mtype; long id; char text[1]; };
Càrrega automàtica de mòduls: kerneld • Quan el kernel necessita un mòdul, envia un missatge al kerneld, que executa el modprobe per carregar el mòdul. • La petició conté informació sobre el dispositiu o element que necessita el mòdul per ser controlat. • Aquesta informació és passada per paràmetre al modprobe • El modprobe sap quin fitxer objecte anar a buscar amb l’ajuda del fitxer /etc/modules.conf • Finalment envia un missatge de resposta al kernel tant si s’ha produït un error com si no.
Càrrega automàtica de mòduls: kerneld kerneld Canal IPC fork+exec kernel petició modprobe Modul.o HD
Descàrrega automàtica de mòduls: kerneld • Per a gestionar la descàrrega automàtica de mòduls, el kerneld va demanant al kernel cada cert temps que revisi la seva llista de mòduls a la cerca de mòduls no usats. • Amb aquesta fi, el kernel guarda dos flags a cada mòdul: AUTOCLEAN i VISITED. • El flag VISITED s’activa quan un mòdul és usat. Quan el kernel revisa tots els mòduls AUTOCLEAN, elimina els no visitats. A la resta, els reseteja el flag.
Descàrrega automàtica de mòduls: kerneld % kerneld Canal IPC kernel avís Modul.o
Càrrega i descàrrega automàtiques: kmod • D’ençà la versió 2.1.90 del kernel, kerneld ha quedat obsolet, essent substituït pel kmod. • kmod ja no és un procés d’usuari, sinó un thread del kernel. • En tots dos casos es crida modprobe per carregar mòduls • kmod no té en compte la descàrrega de mòduls. Per fer-ho és necessària la intervenció del crond, i que sigui ell qui executi periòdicament la comanda: rmmod --all • Perquè s’ha substituit el kerneld pel kmod? • Kerneld utilitzava el sistema de missatges IPC de SysV que ha passat a ser un mòdul a partir de les versions 2.2
Càrrega i descàrrega automàtiques: kmod % kernel cron kmod modprobe modul rmmod --all modul.o HD
Fitxers relacionats amb mòduls • /etc/modules.conf (/etc/conf.modules) • /lib/modules/X.Y.Z/ • /proc/ksyms • /proc/sys/kernel/modprobe • /usr/src/linux/kernel/module.c • /usr/src/linux/kernel/kmod.c
Bibliografia • Linux Documentation Project: • The Linux Kernel Guide: http://www.linuxdoc.org/LDP/tlk/modules/modules.html • Module-HOWTO:http://www.linuxdoc.org/HOWTO/Module-HOWTO/index.html • Kernel Daemon Mini-HOWTO: http://www.linuxdoc.org/HOWTO/mini/Kerneld/index.html • Linux Head Quarters: • http://www.linuxhq.com/kernel/2.4/doc/kmod.txt.html • Pàgines del man.