首页 > 解决方案 > linux内核中具有相同签名的函数

问题描述

考虑函数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

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

标签: clinux-kernel

解决方案


您引用的第一个是特定于 x86 架构的版本。.configx86 架构定义了预处理器符号CONFIG_HAVE_SETUP_PER_CPU_AREA请注意,您引用的第二个链接在未定义该符号时使用。(第三个版本在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阻止setup_per_cpu_areas包含特定于 x86 的内容:

obj-$(CONFIG_SMP)               += setup_percpu.o

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


推荐阅读