Republié depuis : http://blog.csdn.net/zqixiao_09/article/details/50838043
1. Compilation des modules
Dans la partie de la transplantation de pilotes dans la précédente compilation du noyau, nous avons mentionné que la compilation de pilotes est divisée en compilation statique et compilation dynamique ; la compilation statique consiste à compiler le pilote directement dans le noyau, et la compilation dynamique consiste à compiler le pilote en modules.
Il existe deux types de compilation dynamique :
a -- compilation interne
Compiler dans le répertoire source du noyau
b -- compilation externe
Compiler en dehors du répertoire source du noyau
Deuxièmement, l'analyse spécifique du processus de compilation
Remarque : Cette compilation est une compilation externe, le code source du noyau utilisé est le code source d'Ubuntu, et non le code source du noyau linux 3.14 utilisé par la carte de développement, et la plate-forme d'exploitation est X86.
Pour un module de pilote de périphérique Linux ordinaire, voici un code makefile classique. L'utilisation du fichier makefile suivant peut compléter la compilation de la plupart des pilotes. Lors de son utilisation, il vous suffit de modifier le nom du pilote à compiler et à générer. Modifiez simplement la valeur de obj-m.
ifneq ($(KERNELRELEASE),) obj-m:=bonjour.o autre KDIR := /lib/modules/$(shell uname -r)/build PWD :=$(mot de passe shell) tous: créer -C $(KDIR) M=$(PWD) modules faire le ménage: rm -f *.ko *.o *.symvers *.cmd *.cmd.o fin si |
1. Variables dans le makefile
Expliquez d'abord la signification de certaines variables dans le makefile suivant :
(1) KERNELRELEASE est défini dans le makefile de niveau supérieur dans le code source du noyau Linux
(2) Shell pwd obtient le chemin de travail actuel
(3) shell uname -r obtient le numéro de version du noyau actuel
(4) KDIR Le répertoire du code source du noyau actuel.
Il existe deux répertoires sur le code source Linux, à savoir
"/lib/modules/$(shell uname -r)/build"
"/usr/src/linux-header-$(shell uname -r)/"
Mais si vous avez compilé le noyau, vous saurez que le code source dans le répertoire usr est généralement téléchargé et décompressé par nous-mêmes, tandis que le code source dans le répertoire lib est automatiquement copié lors de la compilation. La structure des fichiers des deux est exactement la même même, donc parfois Définissez le répertoire source du noyau sur /usr/src/linux-header-$(shell uname -r)/. Le répertoire du code source du noyau peut être modifié en fonction de votre propre emplacement de stockage.
(5)faire -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
C'est ce qui compile le module :
a -- Changez d'abord le répertoire à l'emplacement spécifié par l'option -C (c'est-à-dire le répertoire du code source du noyau ), où le fichier makefile de niveau supérieur du noyau est enregistré ;
b - - L'option M= fait retourner le makefile dans le répertoire du code source du module avant de construire la cible des modules ; alors, la cible des modules pointe sur le module défini dans la variable obj-m ; dans l'exemple ci-dessus, nous avons défini la variable sur bonjour .o.
2. Étapes d'exécution de make
a -- Lors de la première saisie, la macro "KERNELRELEASE" n'est pas définie, alors saisissez else ;
b -- enregistrer le chemin du noyau, enregistrer le chemin actuel ;
Puisqu'il n'y a pas de cible derrière make, make exécutera la première cible du Makefile qui ne commence pas par . comme cible par défaut. Par défaut, exécutez toute cette règle
c -- faire -C $(KDIR) M=$(PWD) module s
-C Entrer dans le répertoire du noyau pour exécuter le Makefile, KERNELRELEASE se verra attribuer une valeur lors de l'exécution, M=$(PWD) signifie retourner au répertoire courant, exécuter à nouveau le makefile, les modules sont compilés en modules
Donc, ce qui fonctionne réellement ici est
make -C /lib/modules/2.6.13-study/build M=/home/fs/code/1/module/hello/ modules
d -- Exécutez à nouveau le makefile , KERNELRELEASE aura une valeur, et obj-m:=hello.o sera exécuté
obj-m : signifie lier hello.o et d'autres fichiers objets dans un fichier de module hello.ko, et compiler hello.c dans un fichier hello.o en premier lors de la compilation
On peut voir que make est appelé 3 fois ici
1) -- make
2) -- Le makedile de niveau supérieur de l'arborescence des sources du noyau Linux est appelé et généré. o fichier
3) -- appel du fichier makefile de l'arborescence des sources du noyau linux, lien du fichier .o dans le fichier ko
3. Compiler plusieurs fichiers
S'il existe plusieurs fichiers source, utilisez la méthode suivante :
obj-m := bonjour.o
bonjour-objs := fichier1.o fichier2.o fichier3.o
3. Instructions simples pour la compilation interne
Si vous déplacez le module hello dans le code source du noyau. Par exemple, mettez-le dans /usr/src/linux/driver/, KERNELRELEASE sera défini.
Dans /usr/src/linux/Makefile, il y a KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)$(LOCALVERSION).
A ce moment, le module hello n'est plus compilé avec make seul, mais compilé avec les modules make dans le noyau.A ce moment, le module pilote est compilé avec le noyau.