Comment charger des modules du noyau Linux à partir de code C?
J'ai une application qui possède à la fois les deux modules du noyau et l'espace utilisateur démon. Je veux charger les modules du démon code, écrit en C, au démarrage, et de les décharger sur la propreté de la sortie. Puis-je charger d'une manière plus propre que de faire system("modprobe module");
et les décharger à l'aide de l'correspondant rmmod
?
Même si vous pouvez éviter
modprobe
vous ne devriez probablement pasOriginalL'auteur Prof. Moriarty | 2011-05-10
Vous devez vous connecter pour publier un commentaire.
Minimum praticable exemple
Testé sur un QEMU + Buildroot VM et Ubuntu 16.04 hôte avec ce simple paramètre de module de l'imprimante .
Nous utilisons le
init_module
/finit_module
etremove_module
Les appels système Linux.Le noyau Linux dispose de deux appels système pour le module d'insertion:
init_module
finit_module
et:
documents:
finit
est plus récente et a été ajouté que dans la v3.8. Plus de justification: https://lwn.net/Articles/519010/glibc ne semblent pas offrir une C wrapper pour eux, afin que nous venons de créer notre propre
syscall
.insmod
:rmmod
:Busybox source d'interprétation
Busybox fournit
insmod
, et depuis qu'il est conçu pour le minimalisme, on peut tenter d'en déduire comment il est fait à partir de là.Sur la version 1.24.2, le point d'entrée est à
modutils/insmod.c
fonctioninsmod_main
.La
IF_FEATURE_2_4_MODULES
est facultatif soutien pour les anciens du noyau Linux 2.4 modules, pour qu'on puisse l'ignorer pour l'instant.Qui transfère simplement à
modutils.c
fonctionbb_init_module
.bb_init_module
tentatives de deux choses l'une:mmap
le fichier de la mémoire à travers lestry_to_mmap_module
.Cette règle toujours
image_size
à la taille de la.ko
fichier comme un effet secondaire.si cela échoue,
malloc
le fichier dans la mémoire avec laxmalloc_open_zipped_read_close
.Cette fonction en option dézippe le fichier d'abord si c'est un zip, et juste mallocs c'est le contraire.
Je ne comprends pas pourquoi cette compression de faire des affaires, car nous ne pouvons même pas compter sur elle car la
try_to_mmap_module
ne semble pas décompresser les choses.Enfin, vient l'appel:
où
image
est l'exécutable qui a été mis en mémoire, et les options sont juste""
si nous appelonsinsmod file.elf
sans plus d'arguments.init_module
est fournie ci-dessus par:ulibc
est un intégré de la libc mise en œuvre, et il sembleinit_module
.Si elle ne l'est pas, je pense que la glibc est supposé, mais comme
man init_module
dit:BusyBox sagement en résulte que des conseils et utilise
syscall
, qui glibc fournit, et qui propose une API C pour les appels-système.boa Felipe! Se tiver algum problema com o repo, abre de messagerie unifiée, la question que l'agent da um jeito.
stackoverflow.com/users/895245/... . Se voce tiver um tempo livre poderia moi ajudar nessa questao em como escrever e ler pas i2c ou C++? Obrigado stackoverflow.com/questions/52966483/...
Santilli - Ue solucionei usando o codigo de wiringPiI2C com algumas modificacoes para o meu i2c virtuel stackoverflow.com/questions/52966483/... . Obrigado pela dica! Agora de l'ue nao estou conseguindo remover o modulo. Quero dizer: se de l'ue faco un sequincia AddModule > DeleteModule. Funciona. Se ue faco un sequencia AddModule > writeI2C > ReadI2C > DeleteModule. o DeleteModule nao funciona. meu erro:
delete_module: Resource temporarily unavailable
. Ja' tentei colocar de messagerie unifiée sommeil de 1 segundo mas nao funciona.OriginalL'auteur
insmod/rmmod utiliser les fonctions
init_module
etdelete_module
pour ce faire, qui ont aussi un homme-page disponible. Ils déclarer les fonctions queextern
au lieu d'inclure un en-tête, mais l'homme-page dit qu'ils devraient être en<linux/module.h>
.OriginalL'auteur
Je voudrais recommander l'utilisation de
system()
quelque démon code qui s'exécute avec les privilèges de root car il est relativement facile à exploiter à partir d'un point de vue sécurité.modprobe
etrmmod
sont, en effet, les bons outils pour le travail. Cependant, il faudrait être un peu plus propre et beaucoup plus sûr d'utiliser un explicitefork()
+exec()
de les invoquer.OriginalL'auteur
Vous pouvez effectuer les mêmes tâches que
modprobe
et Co. faire, mais je doute que l'on puisse être caractérisée comme nettoyant.OriginalL'auteur
Je ne suis pas sûr qu'il y a un nettoyant façon que
system
.Mais pour sûr, si vous voulez charger/décharger les modules à partir de votre espace utilisateur démon, alors vous vous forcez à exécuter le démon en tant que root*, qui ne peut être considéré comme sécurisé.
*: ou vous pouvez ajouter les commandements explicites dans le fichier sudoers, mais cela va être un cauchemar à gérer lorsque vous déployez votre application.
OriginalL'auteur