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

时间:2012-10-17 21:45:09

标签: memory-management linux-kernel arm linux-device-driver

我正在调试我的内核模块,它似乎有内存损坏, 基本上是由alloc_netdev()为net_device'分配的一块内存。 实例已被破坏。

1)我在我的内核CONFIG_DEBUG_KERNEL中启用了CONFIG_DEBUG_SLABCONFIG_DEBUG_KMEMLEAK.config,但不确定对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)我也想知道我是否可以申请一些&#34;只读&#34;在这个内存上的属性,这种方式我希望有人试图修改内存时生成Oops。听起来合理吗?

感谢任何建议,谢谢。

标记

1 个答案:

答案 0 :(得分:9)

要捕获不正确的内存访问,KAsankmemcheck可能更有用。但是,请注意,Kmemcheck会产生重大影响,有时可能是不可接受的,因此由您决定。 KASan应该快得多。

1。 关于kmemleak,其操作在kernel docs中有详细描述。

简而言之,执行

更可靠
echo scan > /sys/kernel/debug/kmemleak

以root身份在您阅读/sys/kernel/debug/kmemleak之前立即触发内存分析。有时,在阅读kmemleak的报告之前,我发现两次执行上述命令更加可靠。

要“重置”kmemleak收集的数据,您可以执行

echo clear /sys/kernel/debug/kmemleak

您发布的输出意味着kmemleak认为在工具上次分析内存时,地址0xc625e000的大小为2Kb的内存区域尚未释放。回溯指定内存的分配位置。 “swapper”是已分配该内存区域的进程的名称。

2。 就设置存储器只读而言,这种技术确实用于内核的某些地方,例如保护内核的代码和模块。我不能在这里给出确切的指示,但set_page_attributes() function的实施是开始挖掘的好地方。

请注意,我上面提到的kmemcheck使用了一种类似的技术来跟踪内存访问:使页面“看起来”像它们不存在,因此每次访问它们都会导致页面错误等。详细信息在{{3像往常一样。