Comment personnaliser l'ordre de chargement du pilote intégré (pour charger d'abord un module de pilote intégré, puis pour le module dépendant ultérieurement)?
Les pilotes intégrés ne seront pas chargés , donc intégrés. Leurs fonctions d'initialisation sont appelées et les pilotes sont activés lorsque le noyau s'installe lui-même. Ces fonctions init sont appelées dans init/main.c::do_initcalls()
. Tous les appels initiaux sont classés en niveaux, définis dans initcall_levels
et include/linux/init.h
.
Ces niveaux sont des symboles réels définis dans le script de l'éditeur de liens (Arch/*/kernel/vmlinux.lds.*
). Au moment de la compilation du noyau, l’éditeur de liens rassemble toutes les fonctions marquées module_init()
ou autre *_initcall()
, les classe en niveaux, place toutes les fonctions au même niveau au même endroit et crée comme un tableau de pointeurs de fonctions.
Ce que do_initcall_level () fait au moment de l'exécution, c'est d'appeler chaque fonction pointée par les pointeurs du tableau. Il n'y a pas de politique d'appel, à l'exception des niveaux, dans do_initcall_level, mais l'ordre dans le tableau est décidé dans le temps de liaison.
Ainsi, vous pouvez maintenant voir que l'ordre d'initiation du pilote est fixé au moment du lien, mais que pouvez-vous faire?
Makefile
Le premier est clair si vous avez lu ce qui précède. c'est-à-dire) utilisez early_initcall () à la place si c'est approprié.
La seconde demande un peu plus d'explications. La raison pour laquelle l'ordre dans une variable Makefile
est liée au fonctionnement du système de construction du noyau actuel et à la manière dont fonctionnent les lieurs. Pour résumer, le système de construction prend tous les fichiers objet dans obj-y
et les relie. Il est fortement dépendant de l'environnement, mais il est très probable que l'éditeur de liens place le premier fichier objet dans le obj-y
dans l'adresse la plus basse, ainsi appelé plus tôt.
Si vous souhaitez simplement que votre pilote soit appelé avant les autres pilotes du même répertoire, cette méthode est la plus simple.
depmod
examine les symboles exportés et requis par chaque module et effectue un tri topologique sur eux que modprobe
peut ensuite utiliser pour charger les modules dans le bon ordre. Exiger les symboles des modules sur lesquels vous souhaitez être dépendant est suffisant pour qu'il fasse la bonne chose.
Récemment, j'ai eu ce problème. Mon pilote de chargeur dépend du pilote ADC. Avant de charger le pilote ADC, le pilote du chargeur a donc été chargé et la vérification du contrôle adc, définie dans le fichier DTS, doit être initialisée par le pilote ADC. sa résolue en changeant l'ordre du module dans les pilotes/Makefile