Développement de module de noyau pour le développement de pilotes Linux (2) - débuter avec la compilation de module de noyau Makefile

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.

Je suppose que tu aimes

Origine blog.csdn.net/g1093896295/article/details/82813859
conseillé
Classement