如何获取使用insmod插入的内核模块的地址?

时间:2011-06-17 10:46:02

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

我想知道内核模块的地址。实际上,从堆栈跟踪看,崩溃是从内核模块触发的(在系统启动后已经过了问题)。有几个模块我手动insmod。所以我需要检测其中哪个模块触发崩溃。请告诉我如何使用insmod获取每个模块的地址。

3 个答案:

答案 0 :(得分:8)

cat /proc/modules应该为您提供加载内容的粗略指南。通过查看/proc/kallsyms,您可能会更准确地了解内核崩溃的位置。

答案 1 :(得分:4)

/sys/module/<MODULE_NAME>/sections/包含模块所有部分的地址。由于大多数部分以点(.)开头,因此在列出此目录内容时,请不要忘记将-a传递给ls

$ ls -a /sys/module/usbcore/sections/
.                      __ex_table                 __param
..                     .fixup                     .rodata
.altinstr_replacement  .gnu.linkonce.this_module  .rodata.str1.1
.altinstructions       .init.text                 .rodata.str1.8
.bss                   __kcrctab_gpl              .smp_locks
__bug_table            __ksymtab_gpl              .strtab
.data                  __ksymtab_strings          .symtab
.data..read_mostly     __mcount_loc               .text
.data.unlikely         .note.gnu.build-id         .text.unlikely
.exit.text             .parainstructions          __verbose

答案 2 :(得分:0)

pr_debug关于dmesg

如果我们启用pr_debug,则会显示模块加载的基地址。

这可能很有用,例如,如果模块在init_module发生混乱,您无法以交互方式阅读/proc/modules

启用pr_debug的最佳方法是使用CONFIG_DYNAMIC_DEBUG=y编译内核,如下所述:Why is pr_debug of the Linux kernel not giving any output?

然后当你这样做:

echo 8 > /proc/sys/kernel/printk
echo 'file kernel/module.c +p' > /sys/kernel/debug/dynamic_debug/control
insmod mymodule.ko

我们看到一行表格:

0xffffffffc0005000 .text        

包含基地址。