加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 搭建环境 > Windows > 正文

探索Linux内核:Kconfig/kbuild的秘密

发布时间:2019-08-16 00:40:23 所属栏目:Windows 来源:Cao Jin
导读:副标题#e# 深入理解 Linux 配置/构建系统是如何工作的。 自从 Linux 内核代码迁移到 Git 以来,Linux 内核配置/构建系统(也称为 Kconfig/kbuild)已存在很长时间了。然而,作为支持基础设施,它很少成为人们关注的焦点;甚至在日常工作中使用它的内核开发

第一个很容易理解,但第二个和第三个呢? 内核开发人员经常会看到如下代码:

  1. #ifdef CONFIG_SMP
  2. __boot_cpu_id = cpu;
  3. #endif

CONFIG_SMP 改变时,这段代码应该重新编译。编译源文件的命令行也很重要,因为不同的命令行可能会导致不同的目标文件。

.c 文件通过 #include 指令使用头文件时,你需要编写如下规则:

  1. main.o: defs.h
  2.         recipe...

管理大型项目时,需要大量的这些规则;把它们全部写下来会很乏味无聊。幸运的是,大多数现代 C 编译器都可以通过查看源文件中的 #include 行来为你编写这些规则。对于 GNU 编译器集合(GCC),只需添加一个命令行参数:-MD depfile

  1. # In scripts/Makefile.lib
  2. c_flags        = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE)    
  3.                  -include $(srctree)/include/linux/compiler_types.h      
  4.                  $(__c_flags) $(modkern_cflags)                          
  5.                  $(basename_flags) $(modname_flags)

这将生成一个 .d 文件,内容如下:

  1. init_task.o: init/init_task.c include/linux/kconfig.h
  2.  include/generated/autoconf.h include/linux/init_task.h
  3.  include/linux/rcupdate.h include/linux/types.h
  4.  ...

然后主程序 fixdep 通过将 depfile 文件和命令行作为输入来处理其他两个依赖项,然后以 makefile 格式输出一个 .<target>.cmd 文件,它记录命令行和目标的所有先决条件(包括配置)。 它看起来像这样:

  1. # The command line used to compile the target
  2. cmd_init/init_task.o := gcc -Wp,-MD,init/.init_task.o.d  -nostdinc ...
  3. ...
  4. # The dependency files
  5. deps_init/init_task.o :=
  6. $(wildcard include/config/posix/timers.h)
  7. $(wildcard include/config/arch/task/struct/on/stack.h)
  8. $(wildcard include/config/thread/info/in/task.h)
  9. ...
  10. include/uapi/linux/types.h
  11. arch/x86/include/uapi/asm/types.h
  12. include/uapi/asm-generic/types.h
  13. ...

在递归 make 中,.<target>.cmd 文件将被包含,以提供所有依赖关系信息并帮助决定是否重建目标。

这背后的秘密是 fixdep 将解析 depfile(.d 文件),然后解析里面的所有依赖文件,搜索所有 CONFIG_ 字符串的文本,将它们转换为相应的空的头文件,并将它们添加到目标的先决条件。每次配置更改时,相应的空的头文件也将更新,因此 kbuild 可以检测到该更改并重建依赖于它的目标。因为还记录了命令行,所以很容易比较最后和当前的编译参数。

展望未来

Kconfig/kbuild 在很长一段时间内没有什么变化,直到新的维护者 Masahiro Yamada 于 2017 年初加入,现在 kbuild 正在再次积极开发中。如果你不久后看到与本文中的内容不同的内容,请不要感到惊讶。

【编辑推荐】

  1. 如何在Linux上安装应用程序
  2. 详解Linux Shell脚本编写技巧,附实例说明
  3. 如何在Linux上安装Elasticsearch和Kibana
  4. Linux性能实时监测工具之NetData搭建
  5. 如何在Linux命令行操作PDF
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读