我需要在 x86 架构上的内核空间中通过名称自动识别出现故障的模块。挑战在于我只有一个随机内存地址与发生故障时发生故障的模块相关联。我正在寻找一种仅根据此地址确定模块名称的方法。我设想了类似下面的伪代码的东西,但一直无法找到一种方法来完全实现这种方法:
void get_mod_name(unsigned long addr)
{
struct module *mod;
foreach(&mod, all_modules) {
if(in_mod_addr_range(mod, addr))
printk(KERN_WARNING "Module's name is: %s", mod->name);
}
}
有什么想法吗?我已经考虑过在
m̀odules
的上下文中存在一个 kernel/module/internal.h
列表,但仍然不知道如何访问它并提供我需要的信息。
您可以通过以 root 身份读取 /proc/modules 来启动每个模块
rfcomm 102400 16 - Live 0xffffffffc1e70000
snd_seq_dummy 12288 0 - Live 0xffffffffc1e6a000
snd_hrtimer 12288 1 - Live 0xffffffffc1e60000
xt_CHECKSUM 12288 1 - Live 0xffffffffc1e5a000
xt_MASQUERADE 16384 3 - Live 0xffffffffc1e52000
xt_conntrack 12288 1 - Live 0xffffffffc1e4c000
由于这些是按从高到低的顺序排列的,因此当您发现低于目标的地址时可以停止。