init_module(2) System Calls Manual init_module(2) NOM init_module, finit_module - Charger un module de noyau BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include /* Definition des constantes MODULE_* */ #include /* Definition des constantes SYS_* */ #include int syscall(SYS_init_module, void module_image[.len], unsigned long len, const char *param_values); int syscall(SYS_finit_module, int fd, const char *param_values, int flags); Note : la glibc ne fournit pas de fonction autour de cet appel systeme, l'utilisation de syscall(2) est requise. DESCRIPTION init_module() charge une image ELF dans l'espace du noyau, realise toutes les reallocations de symboles necessaires, initialise les parametres du module aux valeurs fournies par l'appelant et execute ensuite la fonction init du module. Cet appel systeme necessite des droits. L'argument module_image pointe vers un tampon contenant l'image binaire a charger ; len indique la taille du tampon. L'image du module devrait etre une image ELF valable, construite pour le noyau en fonctionnement. L'argument param_values est une chaine contenant une liste de valeurs, separees par des espaces, de parametres du module (definis dans le module en utilisant module_param() et module_param_array()). Le noyau analyse cette chaine et initialise les parametres indiques. Toutes les specifications de parametres sont de la forme : nom[ =valeur [, valeur...]] Le parametre nom est un de ceux definis dans le module en utilisant module_param() (consultez le fichier include/linux/moduleparam.h dans les sources du noyau Linux). Le parametre valeur est facultatif pour les parametres de type bool et invbool. Les valeurs des parametres de tableau sont indiquees en liste, separees par des virgules. finit_module() L'appel systeme finit_module() est comme init_module(), mais lit le module a charger a partir du descripteur de fichier fd. Il est utile quand l'authenticite d'un module du noyau peut etre determinee par son emplacement sur le systeme de fichiers. Dans les cas ou c'est possible, la complication induite par la verification cryptographique de modules signes pour determiner leur authenticite peut etre evitee. L'argument param_values est comme pour init_module(). L'argument flags modifie l'operation de finit_module(). C'est un masque OU bit a bit de zero ou plusieurs des attributs suivants. MODULE_INIT_IGNORE_MODVERSIONS Ignorer les hachages de version de symbole. MODULE_INIT_IGNORE_VERMAGIC Ignorer la version magique du noyau. Certaines verifications de securite sont construites dans un module pour s'assurer qu'il correspond au noyau sur lequel il est charge. Ces verifications sont enregistrees quand le module est construit et utilisees quand le module est charge. D'abord, le module enregistre une chaine << vermagic >> contenant le numero de version du noyau et les fonctionnalites principales (comme le type de microprocesseur). Ensuite, si le module a ete construit avec l'option de configuration CONFIG_MODVERSIONS activee, un hachage de version est enregistre pour chaque symbole que le module utilise. Ce hachage est base sur les types de l'argument et la valeur de retour pour la fonction nommee par le symbole. Dans ce cas, le numero de version du noyau dans la chaine << vermagic >> est ignore, car les hachages de version de symbole sont supposes etre suffisamment fiables. L'utilisation de l'attribut MODULE_INIT_IGNORE_VERMAGIC indique que la chaine << vermagic >> est a ignorer, et l'attribut MODULE_INIT_IGNORE_MODVERSIONS indique que les hachages de version de symbole sont a ignorer. Si le noyau est construit pour permettre le chargement force (c'est-a-dire configure avec CONFIG_MODULE_FORCE_LOAD), alors le chargement continuera, sinon il echouera avec ENOEXEC comme attendu pour les modules malformes. VALEUR RENVOYEE Ces appels systeme renvoient 0 en cas de succes, ou -1 en cas d'echec, auquel cas errno est positionne pour indiquer l'erreur. ERREURS EBADMSG (depuis Linux 3.7) La signature du module est mal formatee. EBUSY Delai depasse en essayant de resoudre une reference de symbole par ce module. EFAULT Un argument d'adresse faisait reference a un emplacement en dehors de l'espace d'adressage accessible du processus. ENOKEY (depuis Linux 3.7 La signature du module est incorrecte ou le noyau n'a pas de clef pour ce module. Cette erreur n'est renvoyee que si le noyau a ete configure avec CONFIG_MODULE_SIG_FORCE. Si le noyau n'a pas ete configure avec cette option, alors un module incorrect ou non signe corrompt simplement le noyau. ENOMEM Plus assez de memoire. EPERM L'appelant n'avait pas les droits (n'avait pas la capacite CAP_SYS_MODULE), ou le chargement de module est desactive (consultez /proc/sys/kernel/modules_disabled dans proc(5)). Les erreurs supplementaires suivantes peuvent survenir pour init_module(). EEXIST Un module de ce nom est deja charge. EINVAL param_values est incorrect, ou certaines parties de l'image ELF de module_image contiennent des incoherences. ENOEXEC L'image binaire fournie dans module_image n'est pas une image ELF, ou est une image ELF incorrecte ou pour une autre architecture. Les erreurs supplementaires suivantes peuvent survenir pour finit_module(). EBADF Le fichier indique par fd n'est pas ouvert en lecture. EFBIG Le fichier indique par fd est trop gros. EINVAL flags n'est pas correct. ENOEXEC fd ne fait pas reference a un fichier ouvert. ETXTBSY (depuis Linux 4.7) Le fichier indique par fd est ouvert en lecture et ecriture. En plus des erreurs precedentes, si la fonction init du module est executee et renvoie une erreur, alors init_module() ou finit_module() echoue et errno est definie a la valeur renvoyee par la fonction init. STANDARDS Linux. HISTORIQUE finit_module() Linux 3.8. L'appel systeme init_module() n'est pas pris en charge par la glibc. Il n'est pas declare dans les en-tetes de la glibc mais, par un caprice de l'histoire, les versions de la glibc anterieures a la glibc 2.23 fournissaient une interface binaire pour cet appel systeme. Ainsi, avant la glibc 2.23, il suffit de declarer manuellement l'interface dans votre code pour utiliser cet appel systeme. Sinon, vous pouvez l'invoquer en utilisant syscall(2). Linux 2.4 et anterieurs Dans Linux 2.4 et anterieurs, l'appel systeme init_module() etait assez different : #include int init_module(const char *name, struct module *image); (les applications en espace utilisateur peuvent detecter la versions de init_module() disponible en appelant query_module() ; ce dernier appel echoue avec l'erreur ENOSYS a partir de Linux 2.6) L'ancienne version de l'appel systeme charge l'image de module reallouee pointee par image dans l'espace du noyau et execute la fonction init du module. L'appelant doit fournir l'image reallouee (depuis Linux 2.6, l'appel systeme init_module() s'occupe de la reallocation). L'image du module commence avec une structure module suivie par du code et des donnees appropries. Depuis Linux 2.2, la structure module est definie comme suit : struct module { unsigned long size_of_struct; struct module *next; const char *name; unsigned long size; long usecount; unsigned long flags; unsigned int nsyms; unsigned int ndeps; struct module_symbol *syms; struct module_ref *deps; struct module_ref *refs; int (*init)(void); void (*cleanup)(void); const struct exception_table_entry *ex_table_start; const struct exception_table_entry *ex_table_end; #ifdef __alpha__ unsigned long gp; #endif }; On s'attend a ce que tous les champs pointeurs, a l'exception de next et refs, pointent vers l'interieur du corps du module et qu'ils puissent etre initialises de maniere appropriee pour l'espace noyau, c'est-a-dire reloges avec le reste du module. NOTES Des renseignements concernant les modules charges sont disponibles dans /proc/modules et dans les arborescences de fichiers des sous-repertoires par module sous /sys/module. Consultez le fichier include/linux/module.h dans les sources du noyau Linux pour obtenir des renseignements de fond utiles. VOIR AUSSI create_module(2), delete_module(2), query_module(2), lsmod(8), modprobe(8) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier et David Prevot Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 init_module(2)