Memory management 调试内核模块(内存损坏)_

Memory management 调试内核模块(内存损坏)_,memory-management,linux-kernel,arm,linux-device-driver,Memory Management,Linux Kernel,Arm,Linux Device Driver,我正在调试内核模块,它似乎有内存损坏, 基本上是alloc_netdev()为“net_设备”分配的一段内存 实例已损坏 1) 我在我的内核的.CONFIG中打开了CONFIG\u DEBUG\u KERNEL,CONFIG\u DEBUG\u KMEMLEAK,但不确定从KMEMLEAK中可以得到什么。当我读取/sys/kernel/debug/kmemleak时,它是否应该打印出可疑内存泄漏的跟踪转储?是否有办法重置由kmemleak累积的统计数据/信息?最重要的是——有人可以帮助破译输出,

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

1) 我在我的内核的
.CONFIG
中打开了
CONFIG\u DEBUG\u KERNEL
CONFIG\u DEBUG\u 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
未引用对象0xc625e000(大小2048):
通信“交换器”,pid 1,jiffies 4294937521
回溯:
[]创建\u对象+0x11c/0x200
[]呼叫方+0x138/0x178
[]分配skb+0x4c/0x100
[]开发分配skb+0x18/0x3c
[]以太接收填充+0xd8/0x3fc
[]mv_eth_start_内部构件+0x30/0xf8
[]中压启动+0x70/0x244
[]中压断路器开路+0x40/0x64
[]开发开放+0xb4/0x118
[]开发更改标志+0x90/0x168
[]ip_自动_配置+0x1bc/0xecc
[]do_one_initcall+0x5c/0x1bc
[]内核初始化+0x8c/0x108
[]内核线程退出+0x0/0x8
[]0xFFFFFF
2) 我还想知道是否可以在这个内存上应用一些“只读”属性,这样当有人试图修改内存时,我就可以生成
Oops
。听起来合理吗

谢谢你的建议,谢谢


标记以捕获不正确的内存访问,或者可能更有用。但是,请注意,Kmemcheck会导致严重的错误,这有时可能是不可接受的,因此由您决定。卡桑应该快得多

一,。 关于kmemleak,其操作在中有详细描述

简而言之,它执行起来更可靠

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

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

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

二,。 就设置内存只读而言,这种技术确实用于内核的某些地方,例如,保护内核本身和模块的代码。我不能在这里给你确切的指示,但实施是一个很好的开始挖掘的地方


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

Eugene,感谢您提供宝贵的信息。然而,kmemcheck似乎只在x86平台上可用,而我在运行代码时只在ARM平台上面临内存损坏;类似地,set_page_attributes()似乎存在于内核2.6.38+中,并且也仅适用于x86 arch,而我使用的是2.6.31。啊,我假设机器具有x86体系结构。在你的问题上加上“手臂”标签,使问题更加明显。也许,这里的ARM专家可以提供更多的建议。很好的问题和答案:一般的问题是:如何调试内核内存泄漏/内存损坏?内核中有一个选项可以让它吐出正确的堆栈跟踪(即行信息)。这通常会使它更容易。