Mic*_*urr 24 linux-kernel kbuild
我可以使用以下命令.config根据基于ARM的自定义板的指定体系结构默认值创建Linux内核文件:
ARCH=arm make defconfig KBUILD_DEFCONFIG=var_som_mx6_android_defconfig
Run Code Online (Sandbox Code Playgroud)
我以为这个命令或多或少复制./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
Run Code Online (Sandbox Code Playgroud)
我不明白额外的行来自哪里,我总是发现内核配置,makefile和构建脚本的内部工作很难理解.任何人都可以解释这些线路.config可能来自哪里?
Sam*_*nko 37
该.config文件不是简单地从您的defconfig文件中复制的.defconfig以这种格式存储的动机是:defconfig我们只能指定具有非默认值的选项(即我们为董事会更改的选项).这样我们就可以保持小而清晰.每个新的内核版本都带来了许多新的选项,这样我们就不需要defconfig每次内核发布时都更新我们的文件.此外,应该提到内核构建系统在defconfig文件中保留非常特定的选项顺序,因此最好避免手动修改它.相反,你应该使用make savedefconfig规则.
在.config生成文件时,内核构建系统会遍历所有Kconfig文件(来自所有子目录),检查这些Kconfig文件中的所有选项:
defconfig,则构建系统将该选项放入选择的.config值中defconfigdefconfig,则构建系统会将该选项置于.config使用其相应指定的默认值Kconfig检查scripts/kconfig/Makefile和scripts/kconfig/conf.c文件,看看它是如何实际完成的.
来自Javier Martinez的"Kbuild:Linux内核构建系统":
定义配置符号:
Kconfig文件配置符号在称为
Kconfig文件的文件中定义.每个Kconfig文件可以描述任意数量的符号,也可以包括(源)其他Kconfig文件.构建内核编译选项配置菜单的编译目标,例如make menuconfig,读取这些文件以构建树状结构.内核中的每个目录都有一个Kconfig包含Kconfig其子目录文件的目录.在内核源代码目录的顶部,有一个Kconfig文件是选项树的根.在menuconfig(scripts/kconfig/mconf), (gconfig)scripts/kconfig/gconf和其他编译目标援引开始在这个root程序Kconfig,并递归读取Kconfig位于每个子目录中建立自己的菜单文件.还要在每个Kconfig文件中定义要访问的子目录,还取决于用户选择的配置符号值.存储符号值:
.config文件所有配置符号值都保存在一个名为的特殊文件中
.config.每次要更改内核编译配置时,都要执行make目标,例如menuconfig或xconfig.这些Kconfig文件读取文件以创建菜单,并使用.config文件中定义的值更新配置符号的值.此外,这些工具.config使用您选择的新选项更新文件,如果之前不存在,还可以生成一个.因为
.config文件是纯文本,所以您也可以在不需要任何专门工具的情况下进行更改.保存和恢复以前的内核编译配置也非常方便.
您可以使用更简单的语法make defconfig,例如:
$ make ARCH=arm your_board_defconfig
Run Code Online (Sandbox Code Playgroud)
查看可用defconfigs的完整列表:
$ make ARCH=arm help | grep defconfig
Run Code Online (Sandbox Code Playgroud)
如果你需要做反向操作(即defconfig从广泛创建一个整齐的小.config),你可以使用savedefconfig规则:
$ make ARCH=arm savedefconfig
Run Code Online (Sandbox Code Playgroud)
另外,正如0andriy所提到的,您可以使用diffconfig脚本来查看从一个.config到另一个的更改:
$ scripts/diffconfig .config_old .config_new
Run Code Online (Sandbox Code Playgroud)