【问题标题】:debug kernel module (memory corruption_调试内核模块(内存损坏_
【发布时间】:2012-10-17 21:45:08
【问题描述】:

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

1) 我在内核的.config 中打开了CONFIG_DEBUG_KERNELCONFIG_DEBUG_SLABCONFIG_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。听起来合理吗?

感谢任何建议,谢谢。

标记

【问题讨论】:

  • 很好的问答:一般问题是:如何调试内核内存泄漏/内存损坏?
  • 内核中有一个选项可以让它吐出正确的堆栈跟踪(即行信息)。这通常会更容易。

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


【解决方案1】:

要捕获不正确的内存访问,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 使用一种有点类似的技术来跟踪内存访问:使页面“看起来”好像它们不存在,因此每次访问它们都会导致页面错误等。详细信息在 kernel docs ,像往常一样。

【讨论】:

  • 尤金,感谢您提供的宝贵信息。但是,看起来 kmemcheck 仅在 x86 平台上可用,而我在运行代码时仅在 ARM 平台上面临内存损坏;同样,set_page_attributes() 似乎存在于内核 2.6.38+ 中,并且也仅适用于 x86 架构,而我在 2.6.31 上。
  • 啊,我想这台机器有 x86 架构。在您的问题中添加了“arm”标签以使其更加明显。或许,这里的 ARM 专家可以提供更多建议。
猜你喜欢
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多