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

时间:2014-02-10 09:23:58

标签: c linux-kernel linux-device-driver

我正在编写一个涉及tasklist_lock__bss_start

的内核模块

不会导出这些符号。我很确定即使没有导出,我们也可以使用kernsym_lookup_name()

访问文本部分中的符号

参考How my custom module on linux 3.2.28 can make a call to 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代表数据段符号。

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

但不是tasklist_lock

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

1 个答案:

答案 0 :(得分:1)

看到这个贵族post

#include <linux/module.h>
#include <linux/kallsyms.h>
#include <linux/string.h>

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);