Noyau Linux

Makefile du noyau Linux expliqué

Makefile du noyau Linux expliqué
Dans le développement de logiciels, le processus de création et de gestion de grands référentiels de code peut facilement devenir très complexe.

Pour gérer et réduire cette complexité, les développeurs de logiciels organisent le code dans de petits fichiers qui renvoient à des modules spécifiques. Les développeurs peuvent compiler chacun de ces fichiers séparément, puis les lier ensemble pour créer un exécutable logiciel final.

Un exemple de ceci est les projets C constitués de fichiers de code source dans .c extensions et interfaces logicielles dans .h extensions. Chaque fichier source est compilé avec les fichiers d'en-tête pour créer. o objets liés entre eux à l'aide de bibliothèques, créant ainsi des fichiers exécutables.

Pour effectuer ce processus, les développeurs de logiciels utilisent des outils, tels que Make, pour automatiser le processus de génération et les dépendances de fichiers requises. Make utilise des Makefiles pour gérer le comportement du processus de compilation.

Les outils GNU Make fournissent un ensemble de règles et de conventions utilisées pour créer des Makefiles et réduire la complexité en améliorant l'efficacité.

Dans ce tutoriel, nous discuterons des Makefiles du noyau Linux, en particulier Kconfig et Kbuild.

Avant de commencer, il est bon de noter que cet article ne prétend pas tout apprendre sur le système Kernel Build. Cependant, nous fournissons un aperçu de haut niveau de la création d'une image et de modules vmlinux.

Si vous souhaitez obtenir des informations dépassant le cadre de ce didacticiel, nous vous recommandons la ressource suivante pour de meilleures informations :

https://linkfy.to/goMakefilesDocs

https://linkfy.à/gnuMake

Makefiles du noyau : un aperçu

Le Kernel Build System, également appelé système de configuration, est un outil essentiel - pour ceux qui en ont besoin - qui existe depuis un certain temps. Cependant, tout le monde n'utilisera pas ce système ; même les pilotes et autres développeurs de logiciels de bas niveau l'utilisent rarement. Puisque vous lisez ceci, cela signifie que vous voulez en savoir plus sur le Kernel Build System.

Ainsi, nous discuterons de la façon dont le noyau est compilé et discuterons du système Kbuild et Kconfig afin que vous puissiez mieux les comprendre.

Le Kernel Makefile a cinq composants principaux :

  1. Makefile : C'est le premier fichier make situé à la racine source.
  2. arch/$(ARCH) Makefile : C'est le Makefile arch; il agit comme un complément au top Makefile.
  3. .configuration : Ceci est le fichier de configuration du noyau.
  4. Scripts/Makefile.* : Cela définit les règles définies pour tous les Makefiles de kbuild.
  5. Fichiers Makefile de Kbuild : Il y a environ 500 Makefiles kbuild, et ils ne sont pas très faciles à lire. Considérons un fichier tel que :

https://élixir.démarrage.com/linux/latest/source/scripts/Kbuild.inclure

Kconfig

Le fichier Kconfig contient des modules qui aident lors de l'utilisation du make *config. Il aide le noyau à effectuer des configurations sélectives, créant une modularité et une personnalisation pour le processus de construction du noyau.

Il existe différentes cibles de configuration spécifiées par le système Kconfig. Vous pouvez utiliser l'aide make pour afficher les cibles disponibles. Ces cibles sont traitées par divers programmes fournis par le noyau pendant le processus de construction.

Certaines des cibles de Kconfig incluent :

faire linux-windriver.gconfig
faire linux-windriver.xconfig

REMARQUE: Pour utiliser gconfig et xconfig, vous devez avoir les outils de développement QT installés sur le système hôte.

Considérer ce qui suit:

Instantané de code Defconfig à partir de la ressource suivante :

https://élixir.démarrage.com/linux/v5.9/source/scripts/kconfig/Makefile#L98

1. defconfig : $(obj)/conf
2. ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),)
3. @$(kecho) "*** La configuration par défaut est basée sur '$(KBUILD_DEFCONFIG)'"
4. $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
5. autre
6. @$(kecho) "*** La configuration par défaut est basée sur la cible '$(KBUILD_DEFCONFIG)'"
7. $(Q)$(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG)
8. fin si
9.
dix. %_defconfig : $(obj)/conf
11. $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
12.
13. configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/configs/$@)
14.
15. %.configuration : $(obj)/conf
16. $(if $(call configfiles),, $(error Aucune configuration n'existe pour cette cible sur cette architecture))
17. $(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(fichiers de configuration)
18. $(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig

Instantané de code Oldconfig à partir de la ressource suivante :

https://élixir.démarrage.com/linux/v5.9/source/scripts/kconfig/conf.c#L694

1. cas olddefconfig :
2. défaut:
3. Pause;
4.
5.
6. if (input_mode == saveefconfig)
7. if (conf_write_defconfig(defconfig_file))
8. fprintf(stderr, "n*** Erreur lors de l'enregistrement de defconfig dans : %s\n\n",
9. defconfig_file);
dix. retour 1 ;
11.
12. else if (mode_entrée != listnewconfig && input_mode != helpnewconfig)
13. si (!no_conf_write && conf_write(NULL))
14. fprintf(stderr, "\n*** Erreur lors de l'écriture de la configuration.\n\n");
15. sortie(1);
16.
17.
18. /*
19. * Créer automatiquement.conf s'il n'existe pas.
20. * Cela empêche GNU Make 4.1 ou plus d'émettre
21. * "include/config/auto.conf : aucun fichier ou répertoire de ce type"
22. * dans le Makefile de niveau supérieur
23. *
24. * syncconfig crée ou met toujours à jour automatiquement.conf parce que c'est
25. * utilisé lors de la construction.
26. */
27. if (conf_write_autoconf(sync_kconfig) && sync_kconfig)
28. fprintf(stderr,
29. "\n*** Erreur lors de la synchronisation de la configuration.\n\n");
30. retour 1 ;
31.
32.
33. renvoie 0 ;
34.

Il y a beaucoup de cibles dans le système Kconfig. Certains courants incluent config et menuconfig.

Comme mentionné, les cibles sont traitées par divers programmes dans les systèmes hôtes, fournissant soit une interface graphique, soit une ligne de commande. Vous pouvez trouver des outils Kconfig dans /scripts/Kconfig dans la source du noyau.

https://élixir.démarrage.com/linux/latest/source/scripts/kconfig

https://élixir.démarrage.com/linux/latest/source/scripts/kconfig/Makefile

Le premier processus consiste généralement à lire le fichier Kconfig dans le répertoire racine, qui est utilisé pour créer une base de données de configuration initiale. Au fur et à mesure que le processus se poursuit, la base de données est mise à jour lors de la lecture des fichiers dans l'ordre suivant :

.configuration
/lib/modules/$(shell,uname-r)/.configuration
/etc/kernel-config
/boot/config-$(shell,uname-r)
ARCH_DEFCONFIG
arch/$(ARCH)/defconfig

.config est ensuite déposé dans syncconfig, qui accepte le .fichier de configuration en entrée. Il traite le fichier et produit des fichiers, qui sont ensuite classés en différentes catégories telles que :

Fichiers Kbuild

Presque tous les fichiers Kernel sont des Makefiles Kbuild qui utilisent l'infrastructure Kbuild, qui est une fonctionnalité make récursive. Recursive Make est un moyen d'utiliser l'outil Make en tant que commande dans un Makefile. La récursivité est très utile lors de la compilation d'un grand projet.

Kbuild fonctionne en se référant à tous les fichiers que nous avons mentionnés dans la section ci-dessus.

Le système Kbuild construit ses composants en utilisant le Makefile supérieur qui inclut les Makefiles arch avec le nom arch/$(ARCH)/Makefile dans les fichiers de configuration. Il descend récursivement dans des sous-répertoires en invoquant Make sur les composants en utilisant les routines dans les scripts/Makefile.*. Kbuild s'appuie ensuite sur l'objet adjacent et les lie en objets, créant vmlinux.

Pour en savoir plus sur la syntaxe utilisée dans Kbuild Makefiles, reportez-vous à la documentation.

Considérez le script suivant.

https://github.com/torvalds/linux/blob/master/scripts/link-vmlinux.sh

Les fichiers d'objet o utilisés pour créer le vmlinux sont d'abord compilés dans leur fichier intégré respectif .a fichiers comme var KBUILD_VMLINUX_INIT,MAIN,LIBS. Ceux-ci sont composés en vmlinux.

https://github.com/torvalds/linux/blob/master/scripts/Makefile.construire

Conclusion

Dans ce guide, nous avons examiné les systèmes Kbuild et Kconfig dans le système de construction du noyau et leur fonctionnement. Comme nous l'avons mentionné au début du didacticiel, les sujets abordés sont vastes et ne peuvent pas être traités dans un seul didacticiel.

Tutoriel OpenTTD
OpenTTD est l'un des jeux de simulation d'entreprise les plus populaires. Dans ce jeu, vous devez créer une merveilleuse entreprise de transport. Cepe...
SuperTuxKart pour Linux
SuperTuxKart est un excellent titre conçu pour vous apporter l'expérience Mario Kart gratuitement sur votre système Linux. C'est assez stimulant et am...
Tutoriel Bataille pour Wesnoth
The Battle for Wesnoth est l'un des jeux de stratégie open source les plus populaires auxquels vous pouvez jouer en ce moment. Non seulement ce jeu es...