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