Linux kernel Linux内核';我们做什么?

Linux kernel Linux内核';我们做什么?,linux-kernel,kbuild,Linux Kernel,Kbuild,我可以使用以下命令根据自定义ARM板的指定体系结构默认值创建Linux内核.config文件: ARCH=arm make defconfig KBUILD_DEFCONFIG=var_som_mx6_android_defconfig 我认为这个命令或多或少地将/arch/arm/configs/var\u som\u mx6\u android\u defconfig复制到/.config。但是,生成的.config文件并不完全是副本: $ diff --unified arch/arm/

我可以使用以下命令根据自定义ARM板的指定体系结构默认值创建Linux内核
.config
文件:

ARCH=arm make defconfig KBUILD_DEFCONFIG=var_som_mx6_android_defconfig
我认为这个命令或多或少地将
/arch/arm/configs/var\u som\u mx6\u android\u 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
中的这些行可能来自哪里吗?

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

简化解释 当生成
.config
文件时,内核构建系统将检查所有
Kconfig
文件(来自所有子目录),检查这些
Kconfig
文件中的所有选项:

  • 如果在
    defconfig
    中提到该选项,则构建系统将该选项放入
    .config
    中,并在
    defconfig
    中选择值
  • 如果在
    defconfig
    中未提及该选项,则构建系统将使用其默认值将该选项放入
    .config
    ,该默认值在相应的
    Kconfig
检查和文件,看看它是如何实际完成的

更精确、更详细的解释 发件人:

定义配置符号:
Kconfig
文件

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

存储符号值:
.config
文件

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

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

有用的命令 对于
make defconfig
,可以使用更简单的语法,如:

$ make ARCH=arm your_board_defconfig
请参阅以下可用DEFConfig的完整列表:

$ make ARCH=arm help | grep defconfig
如果需要执行反向操作(即从扩展的
.config
创建一个整洁的小型
defconfig
),可以使用
savedefconfig
规则:

$ make ARCH=arm savedefconfig
另外,正如前面提到的,您可以使用
diffconfig
脚本查看从一个
.config
到另一个
.config
的更改:

$ scripts/diffconfig .config_old .config_new

它还生成
include/generated/autoconf.h

此头文件包含在C源文件中。另一方面,
.config
用于Makefile系统


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

感谢您的回答(以及一篇文章的链接,我很惊讶我还没有看到)。在等待一些回复时,我已经计算出额外的行来自通过Kconfig文件验证配置,但是这个答案给了我更多的信息和更好的理解。再次感谢。简而言之,
make-defconfig-KBUILD\u-defconfig=var\u-som\u-mx6\u-android\u-defconfig
make-var\u-som\u-mx6\u-android\u-defconfig
是一样的,因此您基本上不想使用
make-defconfig
,因为它更详细。我收到了一个预配置的内核tarball。在解开并检查
.config
文件时,我可以看到它是针对vexpress板的。但是,是否有一种方法可以检查它配置了哪个确切的defconfig?@HighOnMeat您可以使用
scripts/diffconfig
-m
选项将
.config
文件与
arch/arm/configs/
目录中的每个defconfig文件进行比较(如果您的体系结构是ARM32)。或者您可以使用
make savedefconfig
规则来访问