Man page - finit_module(2)

Packages contains this manual

Available languages:

en fr pl ja ru

Manual

init_module

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
finit_module()
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
Linux 2.4 et antérieurs
NOTES
VOIR AUSSI
TRADUCTION

NOM

init_module, finit_module - Charger un module de noyau

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <linux/module.h> /* Définition des constantes MODULE_* */
#include <sys/syscall.h>
/* Définition des constantes SYS_* */
#include <unistd.h>

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 systùme, l’utilisation de syscall (2) est requise.

DESCRIPTION

init_module () charge une image ELF dans l’espace du noyau, rĂ©alise toutes les rĂ©allocations de symboles nĂ©cessaires, initialise les paramĂštres du module aux valeurs fournies par l’appelant et exĂ©cute ensuite la fonction init du module. Cet appel systĂšme nĂ©cessite des droits.

L’argument module_image pointe vers un tampon contenant l’image binaire Ă  charger ; len indique la taille du tampon. L’image du module devrait ĂȘtre une image ELF valable, construite pour le noyau en fonctionnement.

L’argument param_values est une chaĂźne contenant une liste de valeurs, sĂ©parĂ©es par des espaces, de paramĂštres du module (dĂ©finis dans le module en utilisant module_param () et module_param_array ()). Le noyau analyse cette chaĂźne et initialise les paramĂštres indiquĂ©s. Toutes les spĂ©cifications de paramĂštres sont de la forme :

nom [ = valeur [ , valeur ...]]

Le paramÚtre nom est un de ceux définis dans le module en utilisant module_param () (consultez le fichier include/linux/moduleparam.h dans les sources du noyau Linux). Le paramÚtre valeur est facultatif pour les paramÚtres de type bool et invbool . Les valeurs des paramÚtres de tableau sont indiquées en liste, séparées par des virgules.

finit_module()

L’appel systĂšme finit_module () est comme init_module (), mais lit le module Ă  charger Ă  partir du descripteur de fichier fd . Il est utile quand l’authenticitĂ© d’un module du noyau peut ĂȘtre dĂ©terminĂ©e par son emplacement sur le systĂšme de fichiers. Dans les cas oĂč c’est possible, la complication induite par la vĂ©rification cryptographique de modules signĂ©s pour dĂ©terminer leur authenticitĂ© peut ĂȘtre Ă©vitĂ©e. L’argument param_values est comme pour init_module ().

L’argument flags modifie l’opĂ©ration de finit_module (). C’est un masque OU bit Ă  bit de zĂ©ro 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.

MODULE_INIT_COMPRESSED_FILE (depuis Linux 5.17

Utilisation de la décompression du module interne du noyau.

Certaines vĂ©rifications de sĂ©curitĂ© sont construites dans un module pour s’assurer qu’il correspond au noyau sur lequel il est chargĂ©. Ces vĂ©rifications sont enregistrĂ©es quand le module est construit et utilisĂ©es quand le module est chargĂ©. D’abord, le module enregistre une chaĂźne « vermagic » contenant le numĂ©ro de version du noyau et les fonctionnalitĂ©s principales (comme le type de microprocesseur). Ensuite, si le module a Ă©tĂ© construit avec l’option de configuration CONFIG_MODVERSIONS activĂ©e, un hachage de version est enregistrĂ© pour chaque symbole que le module utilise. Ce hachage est basĂ© sur les types de l’argument et la valeur de retour pour la fonction nommĂ©e par le symbole. Dans ce cas, le numĂ©ro de version du noyau dans la chaĂźne « vermagic » est ignorĂ©, car les hachages de version de symbole sont supposĂ©s ĂȘtre suffisamment fiables.

L’utilisation de l’attribut MODULE_INIT_IGNORE_VERMAGIC indique que la chaĂźne « vermagic » est Ă  ignorer, et l’attribut MODULE_INIT_IGNORE_MODVERSIONS indique que les hachages de version de symbole sont Ă  ignorer. Si le noyau est construit pour permettre le chargement forcĂ© (c’est-Ă -dire configurĂ© avec CONFIG_MODULE_FORCE_LOAD ), alors le chargement continuera, sinon il Ă©chouera avec ENOEXEC comme attendu pour les modules malformĂ©s.

Si le noyau a Ă©tĂ© construit avec CONFIG_MODULE_DECOMPRESS , la fonctionnalitĂ© de dĂ©compression interne au noyau peut ĂȘtre utilisĂ©e. Le code dans l’espace utilisateur peut vĂ©rifier si le noyau prend en charge la dĂ©compression en en lisant l’attribut /sys/module/compression . Si le noyau prend en charge la dĂ©compression, le fichier compressĂ© peut ĂȘtre directement fourni Ă  finit_module () en utilisant le drapeau MODULE_INIT_COMPRESSED_FILE . Le dĂ©compresseur de module interne au noyau gĂšre les algorithmes de compression suivants :

-

gzip (depuis Linux 5.17)

-

xz (depuis Linux 5.17)

-

zstd (depuis Linux 6.2)

Le noyau n’implĂ©mente qu’une seule mĂ©thode de dĂ©compression. Elle est sĂ©lectionnĂ©e pendant la gĂ©nĂ©ration du module, selon la mĂ©thode de compression choisie dans la configuration du noyau.

VALEUR RENVOYÉE

Ces appels systĂšme renvoient 0 en cas de succĂšs, ou -1 en cas d’échec, auquel cas errno est positionnĂ© pour indiquer l’erreur.

ERREURS

EBADMSG (depuis Linux 3.7)

La signature du module est mal formatée.

EBUSY

Délai dépassé en essayant de résoudre une référence de symbole par ce module.

EFAULT

Un argument d’adresse faisait rĂ©fĂ©rence Ă  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 renvoyĂ©e que si le noyau a Ă©tĂ© configurĂ© avec CONFIG_MODULE_SIG_FORCE . Si le noyau n’a pas Ă©tĂ© configurĂ© avec cette option, alors un module incorrect ou non signĂ© corrompt simplement le noyau.

ENOMEM

Plus assez de mémoire.

EPERM

L’appelant n’avait pas les droits (n’avait pas la capacitĂ© CAP_SYS_MODULE ), ou le chargement de module est dĂ©sactivĂ© (consultez /proc/sys/kernel/modules_disabled dans proc (5)).

Les erreurs supplémentaires suivantes peuvent survenir pour init_module ().

EEXIST

Un module de ce nom est déjà chargé.

EINVAL

param_values est incorrect, ou certaines parties de l’image ELF de module_image contiennent des incohĂ©rences.

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 supplémentaires suivantes peuvent survenir pour finit_module ().

EBADF

Le fichier indiquĂ© par fd n’est pas ouvert en lecture.

EFBIG

Le fichier indiqué par fd est trop gros.

EINVAL

flags n’est pas correct.

EINVAL

Les vĂ©rifications de propretĂ© du dĂ©compresseur ont Ă©chouĂ© pendant le chargement d’un module compressĂ© avec le positionnement du drapeau MODULE_INIT_COMPRESSED_FILE .

ENOEXEC

fd ne fait pas référence à un fichier ouvert.

EOPNOTSUPP (depuis Linux 5.17)

Le drapeau MODULE_INIT_COMPRESSED_FILE est positionné pour charger un module compressé et le noyau a été construit sans CONFIG_MODULE_DECOMPRESS .

ETXTBSY (depuis Linux 4.7)

Le fichier indiqué par fd est ouvert en lecture et écriture.

En plus des erreurs précédentes, si la fonction init du module est exécutée et renvoie une erreur, alors init_module () ou finit_module () échoue et errno est définie à la valeur renvoyée par la fonction init .

STANDARDS

Linux.

HISTORIQUE

finit_module ()

Linux 3.8.

L’appel systĂšme init_module () n’est pas pris en charge par la glibc. Il n’est pas dĂ©clarĂ© dans les en-tĂȘtes de la glibc mais, par un caprice de l’histoire, les versions de la glibc antĂ©rieures à la glibc 2.23 fournissaient une interface binaire pour cet appel systĂšme. Ainsi, avant la glibc 2.23, il suffit de dĂ©clarer manuellement l’interface dans votre code pour utiliser cet appel systĂšme. Sinon, vous pouvez l’invoquer en utilisant syscall (2).

Linux 2.4 et antérieurs

Dans Linux 2.4 et antĂ©rieurs, l’appel systĂšme init_module () Ă©tait assez diffĂ©rent :

#include <linux/module.h>

int init_module(const char * name , struct module * image );

(les applications en espace utilisateur peuvent dĂ©tecter la versions de init_module () disponible en appelant query_module () ; ce dernier appel Ă©choue avec l’erreur ENOSYS Ă  partir de Linux 2.6)

L’ancienne version de l’appel systĂšme charge l’image de module rĂ©allouĂ©e pointĂ©e par image dans l’espace du noyau et exĂ©cute la fonction init du module. L’appelant doit fournir l’image rĂ©allouĂ©e (depuis Linux 2.6, l’appel systĂšme init_module () s’occupe de la rĂ©allocation).

L’image du module commence avec une structure module suivie par du code et des donnĂ©es appropriĂ©s. Depuis Linux 2.2, la structure module est dĂ©finie 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 Ă  ce que tous les champs pointeurs, Ă  l’exception de next et refs , pointent vers l’intĂ©rieur du corps du module et qu’ils puissent ĂȘtre initialisĂ©s de maniĂšre appropriĂ©e pour l’espace noyau, c’est-Ă -dire relogĂ©s avec le reste du module.

NOTES

Des renseignements concernant les modules chargés sont disponibles dans /proc/modules et dans les arborescences de fichiers des sous-répertoires 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 française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Philippe MENGUAL <jpmengual@debian.org>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .