c - 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。
内核构建后,内核映像中使用的是哪一个?内核源代码中有很多这样的情况,那么一般来说这样的模式的目的是什么?
解决方案
您引用的第一个是特定于 x86 架构的版本。.config
x86 架构定义了预处理器符号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-n
或obj-y
根据CONFIG_SMP
.
推荐阅读
- directory - 删除包含所有对象版本的 Google Storage 文件夹
- machine-learning - 在 Keras 中,我什么时候应该使用 input_shape 而不是 input_dim?
- excel - 文件夹选择器 Excel VBA 和粘贴路径到单元格
- java - 如何打印斐波那契数,多线程?
- javascript - rails vue.js 深度嵌套(属性的属性)
- sql - 在本机查询中映射 JPA 中的值
- r - VeganCovEllipse 函数没有给我与 Ordiellipse 函数相同的椭圆
- javascript - 求一组对象的平均值
- c# - 将 JSON 对象 A 转换为 JSON B 对象,其中 B 是 A 的严格子集。两者都受两个 json 模式控制。在 .net 核心中
- php - 如何使用 JQuery Repeater 和 php 显示数据库中的数据