考虑一下函数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。
内核构建完成后,在内核镜像中使用哪一个?在内核源代码中有很多这样的情况,那么一般来说,这种模式的目的是什么?
发布于 2018-12-24 07:56:00
您引用的第一个版本是特定于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系统根据CONFIG_SMP的定义将其转换为obj-n或obj-y。
https://stackoverflow.com/questions/53907339
复制相似问题