考虑功能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都定义了与体系结构无关的代码。
构建内核后,内核映像中使用哪个?内核源代码中有很多这样的情况,那么一般来说,这种模式的目的是什么?
答案 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-y
或CONFIG_SMP
。