Pour gérer et réduire cette complexité, les développeurs de logiciels organisent le code dans de petits fichiers qui sont liés à des modules spécifiques. Les développeurs peuvent compiler chacun de ces fichiers séparément, puis les relier ensemble pour créer un logiciel final exécutable.
Un exemple de ceci est C projets composé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 ensemble à 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 construction et les dépendances de fichiers requises. Faire des usages MakeFiles pour gérer le comportement du processus de compilation.
Les outils de fabrication GNU fournissent un ensemble de règles et de conventions utilisées pour créer des makefiles et réduire la complexité de l'amélioration de l'efficacité.
Dans ce didacticiel, nous discuterons des mobilières du noyau Linux, en particulier Kconfig et Kbuild.
Avant de commencer, il est bon de noter que cet article ne prétend pas enseigner tout sur le système de construction du noyau. Cependant, nous fournissons un aperçu de haut niveau de la construction d'une image et de modules VMLinux.
Si vous souhaitez des informations au-delà de la portée de ce tutoriel, nous recommandons la ressource suivante pour de meilleures informations:
https: // linkfy.à / gomakefilesdocs
https: // linkfy.à / gnumake
Maké de noyau: un aperçu
Le système de construction du noyau, é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 système de construction du noyau.
Ainsi, nous discuterons de la façon dont le noyau est compilé et discutez du système KBuild et Kconfig afin que vous puissiez mieux les comprendre.
Le noyau Makefile a cinq composants centraux:
https: // elixir.coffre.com / linux / dernier / source / scripts / kbuild.inclure
Kconfig
Le fichier kconfig contient des modules qui aident lors de l'utilisation de la configuration de Make *. Il aide le noyau à effectuer des configurations sélectives, créant une modularité et une personnalisation du 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 à afficher les cibles disponibles. Ces objectifs sont traités par divers programmes fournis par le noyau pendant le processus de construction.
Certaines cibles de Kconfig comprennent:
faire linux-windriver.Menuconfig - Exécute Menuconfig dans une session de terminal distincte.
faire linux-windriver.gconfig
faire linux-windriver.xconfig
NOTE: Pour utiliser GConfig et XConfig, vous devriez faire installer les outils de développement QT sur le système hôte.
Considérer ce qui suit:
Instantané de code defconfig à partir de la ressource suivante:
https: // elixir.coffre.com / linux / v5.9 / source / scripts / kconfig / makefile # l98
1. defconfig: $ (obj) / confr
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) / confr
11. $ (Q) $< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
12.
13. configFiles = $ (Wildcard $ (srctree) / noyau / configs / $ @ $ (srctree) / arch / $ (srcarch) / configs / $ @)
14.
15. %.config: $ (obj) / confre
16. $ (if $ (appel de configuration) ,, $ (erreur aucune configuration n'existe pour cet objectif sur cette architecture))
17. $ (Q) $ (config_shell) $ (srctree) / scripts / kconfig / merge_config.sh -m .config $ (configFiles)
18. $ (Q) $ (make) -f $ (srctree) / makefile olddefconfig
Instantané de code OldConfig à partir de la ressource suivante:
https: // elixir.coffre.com / linux / v5.9 / source / scripts / kconfig / confre.C # L694
1. Case olddefconfig:
2. défaut:
3. casser;
4.
5.
6. if (input_mode == SAVEDEFCONFIG)
7. if (conf_write_defconfig (defconfig_file))
8. fprintf (stderr, "N *** Erreur tout en enregistrant defconfig à:% s \ n \ n",
9. defConfig_file);
dix. retour 1;
11.
12. else if (input_mode != listNewConfig && input_mode != HelpNewConfig)
13. si (!no_conf_write && conf_write (null))
14. Fprintf (Stderr, "\ n *** Erreur lors de la rédaction de la configuration.\ n \ n ");
15. sortie (1);
16.
17.
18. / *
19. * Créer une auto.confr s'il n'existe pas.
20. * Cela empêche GNU de faire 4.1 ou plus de l'émission
21. * "Inclure / config / auto.conf: pas de tel fichier ou répertoire "
22. * Dans le makefile de niveau supérieur
23. *
24. * SyncConfig crée ou met à jour automatique.conf parce que c'est
25. * Utilisé pendant la construction.
26. * /
27. if (conf_write_autoconf (sync_kconfig) && sync_kconfig)
28. fprintf (stderr,
29. "\ n *** Erreur pendant la synchronisation de la configuration.\ n \ n ");
30. retour 1;
31.
32.
33. retour 0;
34.
Il y a beaucoup de cibles dans le système KConfig. Certains communs incluent config et menuconfig.
Comme mentionné, les cibles sont traitées par divers programmes dans les systèmes hôtes, fournissant une interface graphique ou une ligne de commande. Vous pouvez trouver des outils Kconfig dans / scripts / kconfig dans la source du noyau.
https: // elixir.coffre.com / linux / dernier / source / scripts / kconfig
https: // elixir.coffre.com / linux / dernier / 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 fil du processus, la base de données est mise à jour lors de la lecture de fichiers dans l'ordre suivant:
.configurer
/ lib / modules / $ (shell, uname-r) /.configurer
/ etc / kernel-config
/ boot / config - $ (shell, uname-r)
Arch_defconfig
arch / $ (arch) / defconfig
.Le fichier de configuration est ensuite déposé à SyncConfig, qui accepte le .Fichier de configuration comme entrée. Il traite les fichiers de fichiers et de sortie, qui sont ensuite classés en différentes catégories telles que:
Fichiers kbuild
Presque tous les fichiers du noyau sont des morsures KBuild qui utilisent l'infrastructure KBuild, qui est une fonctionnalité récursive. La marque récursive est un moyen d'utiliser l'outil de fabrication comme commande dans un makefile. La récursivité est très utile lors de la compilation d'un grand projet.
KBuild fonctionne en faisant référence à tous les fichiers que nous avons mentionnés dans la section ci-dessus.
Le système KBuild construit ses composants à l'aide du makefile supérieur qui inclut l'arc makefiles avec le nom arch / $ (arch) / makefile dans les fichiers de configuration. Il descend récursivement en sous-répertoires invoquant la marque sur les composants en utilisant les routines dans les scripts / makefile.*. KBuild s'appuie ensuite sur l'objet adjacent et les relie 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 / maître / scripts / link-vmlinux.shot
Les fichiers d'objet O utilisés pour créer le VMLinux sont compilés en premier dans leur intégré respectif .un fichiers comme var kbuild_vmlinux_init, main, libs. Ceux-ci sont composés dans vmlinux.
https: // github.com / torvalds / linux / blob / maître / 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 comment il fonctionne. Comme nous l'avons mentionné au début du tutoriel, les sujets abordés sont larges et ne peuvent pas être couverts dans un seul tutoriel.