web-dev-qa-db-fra.com

Que fait exactement le noyau Linux `make defconfig`?

Je peux utiliser la commande suivante pour créer un fichier .config du noyau Linux basé sur une architecture par défaut spécifiée pour une carte personnalisée basée sur ARM:

Arch=arm make defconfig KBUILD_DEFCONFIG=var_som_mx6_Android_defconfig

Je pensais que cette commande copie plus ou moins ./Arch/arm/configs/var_som_mx6_Android_defconfig dans ./.config. Cependant, le fichier .config résultant n'est pas exactement une copie:

$ diff --unified Arch/arm/configs/var_som_mx6_Android_defconfig  .config
--- Arch/arm/configs/var_som_mx6_Android_defconfig  2017-01-20 12:10:51.891515984 -0800
+++ .config 2017-01-26 15:31:29.000000000 -0800
@@ -407,6 +407,7 @@
 CONFIG_ARM_ERRATA_751472=y
 CONFIG_ARM_ERRATA_794072=y
 CONFIG_ARM_ERRATA_761320=y
+CONFIG_ARM_ERRATA_845369=y
 # CONFIG_ARM_ERRATA_753970 is not set
 CONFIG_ARM_ERRATA_754322=y
 # CONFIG_ARM_ERRATA_754327 is not set
@@ -2683,7 +2684,6 @@
 CONFIG_AUTOFS4_FS=y
 CONFIG_Fuse_FS=y
 # CONFIG_CUSE is not set
-CONFIG_AUFS_FS=y

 #
 # Caches
@@ -2759,6 +2759,21 @@
 # CONFIG_PSTORE is not set
 # CONFIG_SYSV_FS is not set
 # CONFIG_UFS_FS is not set
+CONFIG_AUFS_FS=y
+CONFIG_AUFS_BRANCH_MAX_127=y
+# CONFIG_AUFS_BRANCH_MAX_511 is not set
+# CONFIG_AUFS_BRANCH_MAX_1023 is not set
+# CONFIG_AUFS_BRANCH_MAX_32767 is not set
+CONFIG_AUFS_SBILIST=y
+# CONFIG_AUFS_HNOTIFY is not set
+# CONFIG_AUFS_RDU is not set
+# CONFIG_AUFS_PROC_MAP is not set
+# CONFIG_AUFS_SP_IATTR is not set
+# CONFIG_AUFS_SHWH is not set
+# CONFIG_AUFS_BR_RAMFS is not set
+# CONFIG_AUFS_BR_Fuse is not set
+CONFIG_AUFS_BDEV_LOOP=y
+# CONFIG_AUFS_DEBUG is not set
 CONFIG_NETWORK_FILESYSTEMS=y
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y

Je ne comprends pas d'où viennent les lignes supplémentaires et j'ai toujours trouvé que le fonctionnement interne de la configuration du noyau, des makefiles et des scripts de construction était difficile à comprendre. Quelqu'un peut-il expliquer d'où viennent ces lignes dans le .config?

16
Michael Burr

Motivation

Le fichier .config n'est pas simplement copié à partir de votre fichier defconfig. La motivation pour stocker defconfig dans un tel format est la suivante: dans defconfig, nous ne pouvons spécifier que des options avec des valeurs autres que les valeurs par défaut (c’est-à-dire des options que nous avons modifiées pour notre forum). De cette façon, nous pouvons le garder petit et clair. Chaque nouvelle version du noyau apporte de nouvelles options. Ainsi, il n’est pas nécessaire de mettre à jour notre fichier defconfig à chaque fois que le noyau est publié. En outre, il convient de mentionner que le système de construction du noyau conserve un ordre très spécifique d'options dans le fichier defconfig; il est donc préférable d'éviter de le modifier à la main. À la place, vous devriez utiliser la règle make savedefconfig.

Explication simplifiée

Lorsque le fichier .config est généré, le système de génération du noyau parcourt tous les fichiers Kconfig (de tous les sous-répertoires), en vérifiant toutes les options de ces fichiers Kconfig

  • si l'option est mentionnée dans defconfig, le système de construction met cette option sur .config avec la valeur choisie dans defconfig
  • si l'option n'est pas mentionnée dans defconfig, le système de génération le met à .config en utilisant sa valeur par défaut, spécifiée dans la Kconfig correspondante

Vérifiez scripts/kconfig/Makefile et scripts/kconfig/conf.c files pour voir comment cela se passe.

Explication plus précise et détaillée

De "Kbuild: le système de construction de noyau Linux" de Javier Martinez :

Définition des symboles de configuration: Kconfig Files

Les symboles de configuration sont définis dans des fichiers appelés fichiers Kconfig. Chaque fichier Kconfig peut décrire un nombre arbitraire de symboles et peut également inclure (source) d'autres fichiers Kconfig. Les cibles de compilation qui construisent les menus de configuration des options de compilation du noyau, telles que make menuconfig, lisent ces fichiers pour créer la structure arborescente. Chaque répertoire du noyau a une Kconfig qui inclut les fichiers Kconfig de ses sous-répertoires. En plus du répertoire du code source du noyau, il existe un fichier Kconfig qui constitue la racine de l'arborescence des options. Les menuconfig (scripts/kconfig/mconf), gconfig (scripts/kconfig/gconf) et d'autres cibles de compilation appellent des programmes qui commencent à cette racine Kconfig et lisent de manière récursive les fichiers Kconfig situés dans chaque sous-répertoire pour créer leurs menus. Le sous-répertoire à visiter est également défini dans chaque fichier Kconfig et dépend également des valeurs du symbole de configuration choisies par l'utilisateur.

Stockage des valeurs de symbole: .config Fichier

Toutes les valeurs de symbole de configuration sont enregistrées dans un fichier spécial appelé .config. Chaque fois que vous souhaitez modifier une configuration de compilation du noyau, vous exécutez une cible de création, telle que menuconfig ou xconfig. Ceux-ci lisent les fichiers Kconfig pour créer les menus et mettent à jour les valeurs des symboles de configuration à l'aide des valeurs définies dans le fichier .config. En outre, ces outils mettent à jour le fichier .config avec les nouvelles options que vous avez choisies et peuvent également en générer une si elle n'existait pas auparavant.

Étant donné que le fichier .config est du texte brut, vous pouvez également le modifier sans recourir à un outil spécialisé. C'est très pratique pour sauvegarder et restaurer les configurations précédentes de compilation du noyau. 

Commandes utiles

Vous pouvez utiliser une syntaxe plus simple pour make defconfig, comme:

$ make Arch=arm your_board_defconfig

Voir la liste complète des defconfigs disponibles avec:

$ make Arch=arm help | grep defconfig

Si vous devez effectuer une action inverse (c.-à-d. Créer une petite defconfig soignée à partir de .config étendu), vous pouvez utiliser la règle savedefconfig:

$ make Arch=arm savedefconfig

De plus, comme mentionné 0andriy, vous pouvez utiliser le script diffconfig pour voir les modifications apportées d'un .config à un autre:

$ scripts/diffconfig .config_old .config_new
23
Sam Protsenko

Il génère également include/generated/autoconf.h.

Ce fichier d'en-tête est inclus par le fichier source C. .config est pour le système Makefile.

Build system génère deux fichiers et veille à leur cohérence.

1
liuyang1