En bref :vous à peine peut écrire un module de noyau utile, qui peut être chargé dans des noyaux d'une gamme relativement large de versions.
Lorsque vous construisez le module sur le noyau compilé avec CONFIG_MODVERSIONS
(comme dans votre cas), pour chaque symbole exporté depuis le noyau, le CRC de ce symbole est stocké dans le fichier du module. Le CRC est une sorte de somme de contrôle , qui prend en compte, entre autres, la disposition des types, utilisés pour les paramètres de la fonction. Par exemple, si la disposition d'un hypothétique struct A
diffère dans deux noyaux, CRC pour la fonction f(struct A *a)
dans ces noyaux diffère également.
Lorsqu'un module est chargé dans le noyau en cours d'exécution, les CRC de toutes les fonctions du module sont comparés à ceux du noyau. S'ils diffèrent, le noyau refuse de charger le module. Pour en savoir plus sur ce mécanisme, consultez la documentation du noyau (Documentation/kbuild/modules.txt).
Ainsi, pour rendre un module chargeable dans deux noyaux différents, vous n'êtes limité qu'aux fonctions dont les paramètres ont la même disposition dans les deux noyaux. En particulier, si mise en page de type struct module
diffère, aucun module ne peut être chargé pour les deux noyaux.
Il existe plusieurs approches pour fournir un pilote adapté à plusieurs noyaux. Le plus simple est de livrer les sources du conducteur et ajoutez-les à dkms
. De cette façon, si le noyau en cours d'exécution n'a pas le pilote construit, le pilote sera compilé automatiquement en utilisant ses sources.