如何从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
代表文本符号。
D
和d
表示数据段符号。
我可以使用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);