导出内核模块的每个CPU符号

时间:2014-01-04 13:16:16

标签: linux linux-kernel kernel-module

我正在尝试从内核导出per-cpu符号“x86_cpu_to_logical_apicid”,以便我的内核模块可以访问它。在“arch / x86 / kernel / apic / x2apic_cluster.c”中,我做了

//static DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid);
DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid); //I remove static
EXPORT_PER_CPU_SYMBOL(x86_cpu_to_logical_apicid); // I add this 

在我重新编译内核后,/ proc / kallsyms显示

0000000000011fc0 V x86_cpu_to_logical_apicid
0000000000012288 V x86_cpu_to_node_map
ffffffff8187df50 r __ksymtab_x86_cpu_to_apicid

然后我尝试使用

访问我的内核模块中的“x86_cpu_to_logical_apicid”
int apicid = per_cpu(x86_cpu_to_logical_apicid, 2) 

然而,当我加载它时,由于“模块中的未知符号”,它无法加载它。标志“V”表示弱对象,但我不确定这是否是我无法导出符号的原因。谁能给我一些建议?谢谢!

1 个答案:

答案 0 :(得分:1)

我意识到OP可能不再对答案感兴趣了,但今天我遇到了类似的问题,我认为它也可能对其他人有所帮助。

在模块中使用导出的per_cpu变量之前,必须先声明它。对于你的情况:

DECLARE_PER_CPU(u32, x86_cpu_to_logical_apicid);

然后,您可以使用get_cpu_var和put_cpu_var安全地访问当前处理器的变量副本。您可以阅读更多here