Ajout de module au noyau

Ajout de module au noyau
Nous allons passer par le processus ou les étapes nécessaires pour ajouter un module de noyau pendant que le noyau s'exécute. Nous discuterons également des quelques utilitaires Linux utiles disponibles. Ces services publics peuvent être utilisés pour obtenir des informations sur le module déjà présent dans le noyau Linux, ajouter un nouveau module et obtenir les informations sur le module fourni.

Description

Commençons par le module du noyau; Le module du noyau est la fonctionnalité distincte logique qui peut être ajoutée à un stade ultérieur du noyau en cours d'exécution. Cela étend les fonctionnalités / fonctions du noyau Linux.

Ces modules sont des fichiers avec l'extension comme «.ko ”, ce qui signifie des objets de noyau. Si nous rencontrons un fichier avec «.ko ”comme extension, il indique clairement qu'il s'agit d'un module de noyau.

Quelques exemples de noms de modules sont: les modules I2C.ko, bonjour.ko, etc.

Le processus d'ajout d'un module de noyau au noyau est également connu sous le nom de chargement d'un module de noyau. Le module du noyau ne peut être chargé que s'il est compatible avec l'arbre source du noyau. Cela signifie que le module du noyau n'est pas indépendant de la plate-forme. Ceux-ci ne peuvent être chargés que sur le noyau avec la même arborescence source et la configuration de construction.

Ajout / chargement du module du noyau

Linux fournit un utilitaire appelé «insmod». C'est l'utilitaire qui peut être utilisé pour charger le module du noyau au niveau du noyau en cours d'exécution.

Pour charger le module du noyau, exécutez simplement la commande comme insmod suivie du nom du fichier du module.

Prenons un exemple de Hello-World.Ko, un module qui est l'exemple classique et imprime le message Hello World. Pour charger le module du noyau Hello-World, ci-dessous est la commande qui peut être utilisée:

Un exemple instantané est fixé ci-dessous; Le fichier en surbrillance est le module du noyau:

$ sudo insmod hello-world.ko

Exemple d'instantané:

Avec l'exécution réussie de la commande ci-dessus, notre module est ajouté au noyau Linux, et nous verrons le message d'impression du module du noyau Helloworld dans le tampon printk. Pour vérifier le message du Hello-World, utilisez la commande DMESG. Si la commande ne se traduit par aucun message d'erreur, il peut être considéré comme un ajout de module réussi. Au fur et à mesure que nous étendons les fonctions du noyau, il nécessite donc des privilèges de super utilisateur pour exécuter «l'insmod». L'exemple de sortie de la commande DMESG est comme ci-dessous:

Sushilrathore-2: ~ / Hello-world $ sudo insmod Hello-world.ko
Sushilrathore-2: ~ / Hello-World $ dmesg
[10500712.434672] Bonjour le monde
Cienauser @ Haxv-Srathore-2: ~ / Hello-World $

La confirmation du module est chargée

Pour confirmer si le module est chargé et présent parmi les autres modules du noyau Linux. La commande «LSMOD» peut être utilisée pour répertorier tous les modules du noyau. Émettez la commande sur le shell Linux, et nous verrons la liste complète des modules chargés du noyau Linux. Émission du LSMOD sur mon système, je vois la sortie ci-dessous à la console:

Sushilrathore-2: ~ / Hello-world $ lsmod
Taille du module utilisé par
hello_world 16384 0
nf_conntrack_ipv6 20480 0
nf_defrag_ipv6 20480 1 nf_conntrack_ipv6
ip6Table_Filter 16384 0
ip6_tables 28672 1 IP6Table_Filter
nf_conntrack_ipv4 16384 0
nf_defrag_ipv4 16384 1 nf_conntrack_ipv4
xt_recent 20480 0
XT_CONNTRACK 16384 0
NF_CONNTRACK 135168 3 XT_CONNTRACK, NF_CONNTRACK_IPV6, NF_CONNTRACK_IPV4
cpuid 16384 0
iptable_filter 16384 1
ipmi_devintf 20480 0
ipmi_msghandler 53248 1 ipmi_devintf

Comme nous pouvons le voir dans les journaux ci-dessus, il existe de nombreux modules répertoriés, et notre module Hello-World est également sur la liste; Et je l'ai mis en évidence pour une tache facile.

Nous avons donc confirmé que notre module est chargé avec succès dans le noyau.

Suppression / déchargement du module du noyau

Pour supprimer ou décharger le module du noyau, nous pouvons utiliser la commande Linux «rmmod». Ceci est la commande qui est utilisée pour supprimer le module du noyau chargé et répertorié par LSMOD. Cette opération nécessite également des privilèges de superutilisateurs. Pour en revenir à notre exemple Hello-World, si nous souhaitons supprimer le module du noyau Hello-monde que nous avons chargé précédemment. Nous devons émettre la commande ci-dessous:

Sushilrathore-2: ~ / Hello-World $ sudo rmmod hello_world
Sushilrathore-2: ~ / Hello-World $

Après l'exécution de la commande, si rien n'est vu sur la console, je.e. il n'y a pas de message d'erreur. Cela signifie que le déchargement / la suppression du module du noyau réussit.

Confirmation de la suppression / déchargement du module

Encore une fois pour confirmer si le module est déchargé avec succès, nous pouvons utiliser la commande LSMOD. Après la suppression du module du noyau, nous ne devons pas voir le module présent dans la liste des modules fournis par «LSMOD».

Voici l'exemple de sortie de mon système:

Sushilrathore-2: ~ / Hello-world $ lsmod
Taille du module utilisé par
nf_conntrack_ipv6 20480 0
nf_defrag_ipv6 20480 1 nf_conntrack_ipv6
ip6Table_Filter 16384 0
ip6_tables 28672 1 IP6Table_Filter
nf_conntrack_ipv4 16384 0
nf_defrag_ipv4 16384 1 nf_conntrack_ipv4
xt_recent 20480 0
XT_CONNTRACK 16384 0
NF_CONNTRACK 135168 3 XT_CONNTRACK, NF_CONNTRACK_IPV6, NF_CONNTRACK_IPV4
cpuid 16384 0
iptable_filter 16384 1
ipmi_devintf 20480 0
ipmi_msghandler 53248 1 ipmi_devintf
vmw_vsock_vmci_transport 32768 1
vsock 36864 2 VMW_VSOCK_VMCI_TRANSPORT
binfmt_misc 20480 1
Intel_rapl_perf 16384 0
Joydev 24576 0
Input_leds 16384 0
VMW_BALLOON 20480 0
serio_raw 16384 0
shpchp 36864 0
VMW_VMCI 69632 2 VMW_BALLON, VMW_VSOCK_VMCI_TRANSPORT

Dans la liste ci-dessus, si nous vérifions, nous ne trouverons pas le module du noyau Hello World. Ce double confirme que le module est supprimé du système.

Il y a un autre utilitaire très important offert, qui peut être utilisé pour obtenir les informations du fichier du module de noyau. «Modinfo» est la commande fournie pour obtenir les détails du module du noyau déjà présent.

Exécution du «modInfo» avec le module du noyau Helloworld Nous obtenons la sortie ci-dessous:

Sushilrathore-2: ~ / Hello-World $ modinfo Hello-World.ko
Nom de fichier: / home / sushilrathore / hello-world / hello-world.ko
Description: Hello World!
Licence: GPL
Srcversion: BBD5A60063B15C8D80048FD
dépend:
retpoline: y
Nom: Hello_world
vermagique: 4.15.Modversions SMP MOD_UNLOCK 0-163 GÉNÉRIQUE
Cienauser @ Haxv-Srathore-2: ~ / Hello-World $

Les informations ci-dessus sont les détails du module du noyau. L'information importante à noter est qu'elle vous fournit la srcversion et le vermagique. Ces informations peuvent être utilisées pour identifier le noyau avec lequel ce module est compatible et peut être chargé dans. Si nous essayons d'ajouter le module de noyau compilé pour d'autres sources Linux ou noyau, nous obtiendrons l'erreur incompatible de la commande INSMOD.

Vous trouverez ci-dessous l'exemple de code et de code de marque que nous avons utilisés dans notre discussion ci-dessus:

Bonjour le monde.c

#inclure
#inclure
#inclure
Module_license ("gpl");
Module_description ("Hello World!");
statique int __inithello_init (void)

printk (kern_info "Hello world \ n");
retour 0;

statique void __exit hello_exit (void)

printk (kern_info "Goodbye World \ n");

module_init (hello_init);
module_exit (hello_exit);

Makefile

OBJ-M = Hello-World.o

tous:

Make -c / lib / modules / $ (shell uname -r) / build / m = $ (pwd) modules

faire le ménage:

faire -c / lib / modules / $ (shell uname -r) / build m = $ (pwd) propre

Conclusion

Jusqu'à présent, nous avons discuté du processus / étapes des modules de noyau chargeables pour ajouter le module du noyau. INSMOD est la commande dont nous avons discuté pour charger le module du noyau. Pour confirmer si le module est chargé avec succès, nous pouvons utiliser la commande LSMOD et enfin, pour supprimer la commande RMMOD peut être utilisée. Il y a un autre utilitaire modinfo qui peut être utilisé pour imprimer les détails du module du noyau.