43

我可以使用以下命令为.config基于 ARM 的自定义开发板创建基于指定架构默认值的 Linux 内核文件:

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可能来自哪里?

4

2 回答 2

67

动机

.config文件不是简单地从您的defconfig文件中复制的。defconfig以这种格式存储的动机是下一个:defconfig我们只能指定具有非默认值的选项(即我们为我们的板更改的选项)。这样我们就可以保持小而清晰。每个新的内核版本都会带来一堆新的选项,这样我们就不需要在defconfig每次内核发布时更新我们的文件。另外,应该提到内核构建系统在defconfig文件中保留了非常特定的选项顺序,因此最好避免手动修改它。相反,您应该使用make savedefconfig规则。

简化解释

生成文件时.config,内核构建系统会遍历所有Kconfig文件(来自所有子目录),检查这些Kconfig文件中的所有选项:

  • 如果在 中提到了选项defconfig,则构建系统将该选项放入.config其中,并在defconfig
  • 如果选项中未提及defconfig,则构建系统将该选项置于.config使用其默认值,在相应的Kconfig

检查scripts/kconfig/Makefilescripts/kconfig/conf.c文件,看看它是如何完成的。

更准确和详细的解释

来自Javier Martinez 的“Kbuild:Linux 内核构建系统”

定义配置符号:Kconfig文件

配置符号在称为Kconfig文件的文件中定义。每个Kconfig文件可以描述任意数量的符号,也可以包含(源)其他Kconfig文件。构建内核编译选项配置菜单的编译目标,例如make menuconfig,读取这些文件以构建树状结构。内核中的每个目录都有一个Kconfig包含Kconfig其子目录文件的目录。在内核源代码目录的顶部,有一个Kconfig文件是选项树的根目录。( )、menuconfig( )和其他编译目标调用从该根目录开始并递归读取scripts/kconfig/mconfgconfigscripts/kconfig/gconfKconfigKconfig位于每个子目录中的文件以构建其菜单。每个文件中还定义了要访问的子目录,Kconfig并且还取决于用户选择的配置符号值。

存储符号值:.config文件

所有配置符号值都保存在一个名为.config. 每次要更改内核编译配置时,都要执行一个 make 目标,例如menuconfigor xconfig。这些读取Kconfig文件以创建菜单并使用文件中定义的值更新配置符号的值.config。此外,这些工具会.config使用您选择的新选项更新文件,如果之前不存在,也可以生成一个。

由于该.config文件是纯文本文件,因此您也可以在不需要任何专门工具的情况下对其进行更改。保存和恢复以前的内核编译配置也非常方便。

有用的命令

您可以使用更简单的语法 for 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
于 2017-01-27T02:57:32.687 回答
3

它还生成include/generated/autoconf.h.

此头文件包含在 C 源文件中。另一方面,.config是针对 Makefile 系统的。

构建系统生成两个文件,并使它们保持一致。

于 2018-03-09T08:53:15.707 回答