我正在尝试从内核导出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”表示弱对象,但我不确定这是否是我无法导出符号的原因。谁能给我一些建议?谢谢!
答案 0 :(得分:1)
我意识到OP可能不再对答案感兴趣了,但今天我遇到了类似的问题,我认为它也可能对其他人有所帮助。
在模块中使用导出的per_cpu变量之前,必须先声明它。对于你的情况:
DECLARE_PER_CPU(u32, x86_cpu_to_logical_apicid);
然后,您可以使用get_cpu_var和put_cpu_var安全地访问当前处理器的变量副本。您可以阅读更多here。