-
Notifications
You must be signed in to change notification settings - Fork 4
Modules
#Modules
##Définition
Un module est un fichier binaire qui peut être chargé dynamiquement dans le noyau, lui ajoutant ainsi des fonctionnalités. Un module est différent d'un programme en deux points. D'une part, les modules sont chargés pour être exécuté en kernel space et non en userspace (permettant ainsi de les utiliser comme driver). D'autre part un module ne dispose pas de point d'entrée, ou de "fonction main". A la place, le module fournis au noyau les informations suivantes:
-
Son nom (l'identifiant de manière unique. On ne peut charger deux modules ayant le même nom)
-
Son numéro de version ( Pour gérer d'éventuelles dépendances/incompatibilités avec d'autres modules)
-
Sa fonction load, qui sera appelée au chargement du module.
-
Sa fonction unload, qui sera appelée au déchargement du module.
Ainsi le module est un code assez générique, qui peut aussi bien contenir un driver que n'importe quel autre code nécessitant d'intéragir directement avec le noyau.
##Développement d'un module pour TacOS
Cette section détail les différentes étapes nécessaires au développement d'un module utilisable dans TacOS
###Exportation des informations du module
Comme expliqué dans la section "Définition", pour pouvoir charger un module, le noyau de TacOS a besoin d'avoir quelques informations sur le module. Il est donc nécessaire que le module exporte ces informations. Pour cela, module.h défini un certain nombre de macro:
` MODULE_NAME(const char*) //Permet d'exporter le nom du module
MODULE_VERSION(const char*) //Permet d'exporter la version du module
MODULE_LOAD(void(*)(void)) //Permet d'exporter la fonction load du module
MODULE_UNLOAD(void(*)(void)) //Permet d'exporter la fonction unload du module `
Pour entrer dans les détails de l'exportation de ces information, le principe est le suivant: Chacune de ces macro crée une section dans le fichier binaire (format ELF dans notre cas). Ces sections contiennent l'addresse de l'information ou la fonction correspondante dans le binaire. Le noyau n'a donc plus qu'à récupérer ces section pour récupérer les informations. Il aurait été plus simple d'exporter les information en utilisant leur symboles, mais cette méthode a le mérite de fonctionner même si le binaire est strippé.
###Compilation du module
Un module est un simple fichier objet. Cela signifie qu'il n'a pas à être linké avec les fonction du noyau qu'il utilise, car cela est fait automatiquement par le noyau au chargement du module. Ainsi, un simple gcc -c mon_module.c -o mon_module.o suffit à la compilation du module.
##Fonctionnement des modules dans TacOS
(TODO)
##Bug connus
- le chargement des différentes sections ne prend pas en compte les alignements requis par le format elf