【问题标题】:Functions with the same signature in linux kernellinux内核中具有相同签名的函数
【发布时间】:2018-12-23 21:36:06
【问题描述】:

考虑函数setup_per_cpu_areas。架构特定代码中有一个定义:https://elixir.bootlin.com/linux/v4.14/source/arch/x86/kernel/setup_percpu.c#L166。在架构独立代码中定义了另一个:https://elixir.bootlin.com/linux/v4.14/source/mm/percpu.c#L2665 或此处:https://elixir.bootlin.com/linux/v4.14/source/mm/percpu.c#L2696

内核构建后,内核映像中使用的是哪一个?内核源码中有很多这样的情况,那么一般来说这样的模式的目的是什么?

【问题讨论】:

  • 它们是有条件的。内核有一个配置工具。这将取决于目标。
  • @polarysekt 我不认为 setup_percpu.c 中的那个在配置下。 percpu.c 中的那个是。

标签: c linux-kernel


【解决方案1】:

您引用的第一个是 x86-arch-specific 版本。 x86 架构的.config 定义了预处理器符号CONFIG_HAVE_SETUP_PER_CPU_AREA。请注意,您引用的第二个链接是在 not 定义该符号时使用的。 (第三个版本在CONFIG_SMP没有定义的情况下使用,因此也不适用于这个x86配置。)

Linux 内核内置了一个相当复杂和强大的配置系统。查看散布在整个内核源代码树中的名为Kconfig 的文件。特别是arch/x86/Kconfig 有这个金块:

config HAVE_SETUP_PER_CPU_AREA
        def_bool y

这基本上是说“在构建 x86 时无条件地将 HAVE_SETUP_PER_CPU_AREA 符号定义为 True”。

总而言之,内核.config 文件中的设置选择了许多功能,有时通过定义或不定义符号来取消选择其他功能。这些符号用于选择编译和链接的代码。一些设置在您的控制之下(尝试make menuconfig 来查看这些设置);其他由每个架构的默认值指定。

编辑:
如果CONFIG_SMP 未启用,arch/x86/kernel/Makefile 中的此设置会阻止包含 x86 特定的setup_per_cpu_areas

obj-$(CONFIG_SMP)               += setup_percpu.o

内核makefile系统根据CONFIG_SMP的定义将其转换为obj-nobj-y

【讨论】:

  • 如果没有定义CONFIG_SMP会怎样?我看不出为什么需要为 x86 定义它的原因。 x86 架构特定定义不在预处理器标志下。如果 CONFIG_SMP 没有定义,那么内核中会有两个定义。
  • “x86 架构特定定义不在预处理器标志下。”特定于架构的目录下的所有内容都是有条件编译的(如果我们的目标架构与目录匹配,则使用它)。
  • 查看我的编辑。花一些时间来了解内核构建系统是值得的。它非常强大,在决定为特定配置编译什么方面起着重要作用。见Documentation/kbuild/*(以makefiles.txt开头)。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
相关资源
最近更新 更多