调试内核模块(内存损坏)

6
我正在调试我的内核模块,似乎有内存损坏问题,基本上由alloc_netdev()为“net_device”实例分配的一片内存已经被破坏。
1)我在内核的.config文件中打开了CONFIG_DEBUG_KERNEL、CONFIG_DEBUG_SLAB和CONFIG_DEBUG_KMEMLEAK,但是不确定从kmemleak应该期望什么。它是否应该在每次读取/sys/kernel/debug/kmemleak时打印出可疑内存泄漏的跟踪转储?是否有一种方法可以重置kmemleak累积的统计/信息?最重要的是,能否有人帮助解密输出,例如:
unreferenced object 0xc625e000 (size 2048):
  comm "swapper", pid 1, jiffies 4294937521
  backtrace:
    [<c00c89f0>] create_object+0x11c/0x200
    [<c00c6764>] __kmalloc_track_caller+0x138/0x178
    [<c01d78c0>] __alloc_skb+0x4c/0x100
    [<c01d8490>] dev_alloc_skb+0x18/0x3c
    [<c0198b48>] eth_rx_fill+0xd8/0x3fc
    [<c019ac74>] mv_eth_start_internals+0x30/0xf8
    [<c019c5fc>] mv_eth_start+0x70/0x244
    [<c019c810>] mv_eth_open+0x40/0x64
    [<c01e00f0>] dev_open+0xb4/0x118
    [<c01df788>] dev_change_flags+0x90/0x168
    [<c001a3e4>] ip_auto_config+0x1bc/0xecc
    [<c00212f4>] do_one_initcall+0x5c/0x1bc
    [<c00083d0>] kernel_init+0x8c/0x108
    [<c0022f58>] kernel_thread_exit+0x0/0x8
    [<ffffffff>] 0xffffffff

2) 我还在想是否可以在这个内存上应用一些“只读”属性,这样我期望当有人尝试修改内存时会生成Oops。这听起来合理吗?

感谢任何建议,谢谢。

马克


伟大的问题和答案:一般的问题是:如何调试内核内存泄漏/内存损坏? - 0x90
内核中有一个选项可以让它输出正确的堆栈跟踪(即行信息),这通常会使事情变得更加容易。 - Alexander Oh
1个回答

9
为了捕获不正确的内存访问,可能更有用的是KAsankmemcheck。但请注意,Kmemcheck已知会产生显著的性能开销,有时可能无法接受,因此需要您自行决定。KASan应该更快。
关于kmemleak,其操作在内核文档中有详细描述。
简而言之,执行以下操作更可靠:
echo scan > /sys/kernel/debug/kmemleak

作为root用户,在读取 /sys/kernel/debug/kmemleak 之前立即触发内存分析可能会更可靠。有时,在读取kmemleak的报告之前,执行以上命令两次甚至更可靠。

要“重置” kmemleak 收集的数据,可以执行以下操作。

echo clear > /sys/kernel/debug/kmemleak

你发布的输出意味着kmemleak认为内存地址0xc625e000处的2Kb内存区域在工具最后一次分析内存时未被释放。回溯指出了内存的分配位置。"swapper"是分配该内存区域的进程名称。
就设置内存只读而言,内核确实在某些地方使用了这种技术,例如保护内核本身和模块的代码。我无法在此提供确切的说明,但set_page_attributes()函数的实现是挖掘的好起点。
请注意,我上面提到的kmemcheck使用了一种类似的技术来跟踪内存访问:使页面“看起来”不存在,以便每次访问都会导致页面故障等。详细信息通常在内核文档中。

Eugene,感谢您提供的宝贵信息。然而,看起来kmemcheck仅适用于x86平台,而我在ARM平台上运行代码时遇到了内存损坏问题;同样,set_page_attributes()似乎只存在于2.6.38+内核且仅适用于x86架构,而我使用的是2.6.31版本。 - Mark
1
啊,我本来以为这台机器是x86架构的。我给你的问题添加了“arm”标签,以使其更明显。也许,在这里有ARM专家可以给出更多建议。 - Eugene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接