Что именно делает ядро ​​Linux `make defconfig`?

Я могу использовать следующую команду для создания файла ядра Linux .config на основе указанной архитектуры по умолчанию для настраиваемой платы на основе ARM:

ARCH=arm make defconfig KBUILD_DEFCONFIG=var_som_mx6_android_defconfig

Я думал, что эта команда более или менее копирует ./arch/arm/configs/var_som_mx6_android_defconfig в ./.config. Однако полученный файл .config не является точно копией:

$ 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

Я не понимаю, откуда берутся дополнительные строки, и я всегда обнаружил, что внутренняя работа конфигурации ядра, make файлов и скриптов сборки трудно понять. Может ли кто-нибудь объяснить, откуда могут появиться эти строки в .config?

Ответ 1

мотивация

.config не просто копируется из вашего файла defconfig. Мотивация для хранения defconfig в таком формате следующая: в defconfig мы можем указывать только параметры со значениями не по умолчанию (т.е. параметры, которые мы изменили для нашей платы). Таким образом, мы можем сохранить его маленьким и ясным. Каждая новая версия ядра приносит кучу новых опций, и таким образом нам не нужно обновлять наш файл defconfig каждый раз, когда ядро выпускает. Также следует отметить, что система сборки ядра хранит очень специфический порядок опций в файле defconfig, поэтому лучше избегать его изменения вручную. Вместо этого вы должны использовать правило make savedefconfig.

Упрощенное объяснение

Когда .config файл .config, система сборки ядра просматривает все файлы Kconfig (из всех подкаталогов), проверяя все параметры в этих файлах Kconfig:

  • если параметр указан в defconfig, система сборки помещает этот параметр в .config со значением, выбранным в defconfig
  • если опция не упоминается в defconfig, система сборки помещает эту опцию в .config используя значение по умолчанию, указанное в соответствующем Kconfig

Проверьте scripts/kconfig/Makefile и scripts/kconfig/conf.c файлы, чтобы увидеть, как это на самом деле сделано.

Более точное и подробное объяснение

Из "Kbuild: система сборки ядра Linux" Хавьера Мартинеса:

Определение символов конфигурации: файлы Kconfig

Символы конфигурации определены в файлах, известных как файлы Kconfig. Каждый файл Kconfig может описывать произвольное количество символов, а также может включать в себя (источник) другие файлы Kconfig. Цели компиляции, которые make menuconfig меню конфигурации параметров компиляции ядра, такие как make menuconfig, читают эти файлы для построения древовидной структуры. Каждый каталог в ядре имеет один Kconfig который включает файлы Kconfig своих подкаталогов. Вверху каталога исходного кода ядра находится файл Kconfig который является корнем дерева опций. menuconfig (scripts/kconfig/mconf), gconfig (scripts/kconfig/gconf) и другие цели компиляции вызывают программы, которые запускаются в этом корневом Kconfig и рекурсивно читают файлы Kconfig расположенные в каждом подкаталоге, для создания своих меню. Какой подкаталог для посещения также определяется в каждом файле Kconfig и также зависит от значений символов конфигурации, выбранных пользователем.

Хранение символьных значений: файл .config

Все значения символов конфигурации сохраняются в специальном файле .config. Каждый раз, когда вы хотите изменить конфигурацию компиляции ядра, вы выполняете цель make, такую как menuconfig или xconfig. Они читают файлы Kconfig для создания меню и обновляют значения символов конфигурации, используя значения, определенные в файле .config. Кроме того, эти инструменты обновляют файл .config новыми выбранными вами опциями, а также могут сгенерировать его, если его не было раньше.

Поскольку файл .config представляет собой простой текст, вы также можете изменить его, не используя какой-либо специализированный инструмент. Это очень удобно для сохранения и восстановления предыдущих конфигураций компиляции ядра.

Полезные команды

Вы можете использовать более простой синтаксис для make defconfig, например:

$ make ARCH=arm your_board_defconfig

Смотрите полный список доступных defconfigs с:

$ make ARCH=arm help | grep defconfig

Если вам нужно выполнить обратное действие (т.е. создать аккуратный маленький defconfig из обширного .config), вы можете использовать правило savedefconfig:

$ make ARCH=arm savedefconfig

Также, как упомянул 0andriy, вы можете использовать скрипт diffconfig для просмотра изменений из одного .config в другой:

$ scripts/diffconfig .config_old .config_new

Ответ 2

Он также генерирует include/generated/autoconf.h.

Этот заголовочный файл включен в исходный файл C. С другой стороны, .config для системы Makefile.

Сборка системы сгенерирует два файла и сохраняет их согласованными.