我可以使用以下命令根据基于ARM的自定义板的指定体系结构默认值创建Linux内核.config
文件:
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
我不明白额外行的来源,我总是发现内核配置,makefile和构建脚本的内部工作很难理解。任何人都可以解释.config
中的这些行可能来自何处?
答案 0 :(得分:27)
.config
文件不是简单地从defconfig
文件中复制的。以defconfig
格式存储defconfig
的动机是:defconfig
我们只能指定具有非默认值的选项(即我们为董事会更改的选项)。这样我们就可以保持小而清晰。每个新的内核版本都带来了许多新选项,这样我们就不需要在每次内核发布时更新我们的defconfig
文件。此外,应该提到内核构建系统在make savedefconfig
文件中保留非常特定的选项顺序,因此最好避免手动修改它。相反,您应该使用.config
规则。
当生成Kconfig
文件时,内核构建系统会遍历所有Kconfig
个文件(来自所有子目录),检查这些defconfig
文件中的所有选项:
.config
中提及了该选项,则构建系统会将该选项放入defconfig
,并在defconfig
中选择值.config
中未提及选项,则构建系统会使用其在相应Kconfig
Kconfig
检查scripts/kconfig/Makefile和scripts/kconfig/conf.c文件,看看它是如何实际完成的。
来自"Kbuild: the Linux Kernel Build System" by Javier Martinez:
定义配置符号:
Kconfig
文件配置符号在称为
Kconfig
文件的文件中定义。每个Kconfig
文件可以描述任意数量的符号,还可以包括(源)其他make menuconfig
文件。构造内核编译选项的配置菜单(例如Kconfig
)的编译目标读取这些文件以构建树状结构。内核中的每个目录都有一个Kconfig
,其中包含其子目录的Kconfig
个文件。在内核源代码目录之上,有一个menuconfig
文件,它是选项树的根。scripts/kconfig/mconf
(gconfig
),scripts/kconfig/gconf
(Kconfig
)和其他编译目标调用从此根Kconfig
开始并递归读取Kconfig
的程序位于每个子目录中的文件以构建其菜单。每个.config
文件中还定义了要访问的子目录,还取决于用户选择的配置符号值。存储符号值:
.config
文件所有配置符号值都保存在名为
menuconfig
的特殊文件中。每次要更改内核编译配置时,都要执行make target,例如xconfig
或Kconfig
。这些文件读取.config
文件以创建菜单,并使用.config
文件中定义的值更新配置符号的值。此外,这些工具会使用您选择的新选项更新.config
文件,如果以前不存在,也可以生成一个。因为
make defconfig
文件是纯文本,所以您也可以在不需要任何专门工具的情况下进行更改。保存和恢复以前的内核编译配置也非常方便。
您可以为$ make ARCH=arm your_board_defconfig
使用更简单的语法,例如:
$ make ARCH=arm help | grep defconfig
使用以下命令查看可用defconfigs的完整列表:
defconfig
如果您需要执行反向操作(即从广泛的.config
创建一个整洁的小savedefconfig
),您可以使用$ make ARCH=arm savedefconfig
规则:
diffconfig
此外,正如 0andriy 所述,您可以使用.config
脚本查看从$ scripts/diffconfig .config_old .config_new
到另一个let
的更改:
list.filter { $0["SearchStrings"] == nil }
答案 1 :(得分:1)
它还会生成include/generated/autoconf.h
。
此源文件包含在C源文件中。另一方面,.config
用于Makefile系统。
构建系统会生成两个文件,并保持一致。