Mar*_*ark 6 arm memory-management linux-device-driver linux-kernel
我正在调试我的内核模块,它似乎有内存损坏,基本上由alloc_netdev()为'net_device'实例分配的一块内存已经损坏.
1)我打开CONFIG_DEBUG_KERNEL
,CONFIG_DEBUG_SLAB
,CONFIG_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
Run Code Online (Sandbox Code Playgroud)
2)我也想知道我是否可以在这个内存上应用一些"只读"属性,这种方式我希望Oops
在有人试图修改内存时生成.听起来合理吗?
感谢任何建议,谢谢.
标记
要捕获不正确的内存访问,KAsan或kmemcheck可能更有用.但是,请注意,Kmemcheck会产生重大影响,有时可能是不可接受的,因此由您决定.KASan应该快得多.
关于kmemleak,其操作在内核文档中有详细描述.
简而言之,执行起来更可靠
echo scan > /sys/kernel/debug/kmemleak
Run Code Online (Sandbox Code Playgroud)
以root身份在您阅读之前立即触发内存分析/sys/kernel/debug/kmemleak
.有时,在阅读kmemleak的报告之前,我发现两次执行上述命令更加可靠.
要"重置"kmemleak收集的数据,您可以执行
echo clear /sys/kernel/debug/kmemleak
Run Code Online (Sandbox Code Playgroud)
您发布的输出意味着kmemleak认为0xc625e000
在工具上次分析内存时,地址大小为2Kb的内存区域尚未释放.回溯指定内存的分配位置."swapper"是已分配该内存区域的进程的名称.
2.就设置内存只读而言,这种技术确实在内核的某些地方使用,例如保护内核的代码和模块.我不能在这里给出确切的说明,但set_page_attributes()函数的实现是开始挖掘的好地方.
请注意,我上面提到的kmemcheck使用了一种类似的技术来跟踪内存访问:使页面"看起来"就像它们不存在一样,因此每次访问它们都会导致页面错误等.详细信息在内核文档中,像往常一样.
归档时间: |
|
查看次数: |
6256 次 |
最近记录: |