如何从LKM获取Linux内核的数据段

我正在编写一个涉及tasklist_lock__bss_start的内核模块。

这些符号不会导出。 我很确定即使没有导出,我们也可以使用kernsym_lookup_name()从文本部分访问符号

参考linux 3.2.28上的自定义模块如何调用print_cpu_info?

 $ vim System.map ... 80017be0 T register_undef_hook 80017c28 T unregister_undef_hook 80017c70 T do_unexp_fiq ... 806eb000 D mmlist_lock 806eb040 D tasklist_lock 806eb080 d softirq_vec .... 

T代表文本符号。
Dd表示数据段符号。

我可以使用kallsyms_lookup_name()访问register_undef_hook()unregister_undef_hook() kallsyms_lookup_name()

但不是tasklist_lock

请分享您的知识,以便从内核模块(LKM)访问tasklist_lock

看到这个高贵的post

 #include  #include  #include  MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Access non-exported symbols"); MODULE_AUTHOR("Stephen Zhang"); static int __init lkm_init(void) { char *sym_name = "__bss_start"; unsigned long sym_addr = kallsyms_lookup_name(sym_name); char filename[256]; strncpy(filename, (char *)sym_addr, 255); printk(KERN_INFO "[%s] %s (0x%lx): %s\n", __this_module.name, sym_name, sym_addr, filename); return 0; } static void __exit lkm_exit(void) { } module_init(lkm_init); module_exit(lkm_exit);