在Linux内核中具有相同签名的功能

时间:2018-12-23 21:36:07

标签: c linux-kernel

考虑功能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都定义了与体系结构无关的代码。

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

1 个答案:

答案 0 :(得分:3)

您引用的第一个是特定于x86-arch的版本。 x86体系结构的.config定义了预处理程序符号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中的此设置将阻止包含特定于x86的setup_per_cpu_areas

obj-$(CONFIG_SMP)               += setup_percpu.o

内核makefile系统根据obj-n的定义将其转换为obj-yCONFIG_SMP