我正在研究ARM Linux
。当我们启用CONFIG_PAGE_POISONING
时,页面会在free_pages()
之后填充有毒字节模式,并在alloc_pages()
之前验证毒药模式。
这有助于我通过在分配新页面之前验证毒字节模式来识别位翻转或页面内存损坏。但如何识别罪魁祸首?我在谷歌搜索,但找不到。
答案 0 :(得分:0)
我知道这是一个老问题,但是我也遇到了类似的问题,并且花了我一些时间对其进行调试。因此,我将在这里推荐对我非常有用的两个工具(我同时使用了这两个工具):
第一个工具:KMEMLEAK
要启用它,您必须在内核配置中启用它:
CONFIG_HAVE_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK=y
如果获得此内核日志:
kmemleak: Kernel memory leak detector disabled
kmemleak: Early log buffer exceeded (xxxx), please increase DEBUG_KMEMLEAK_EARLY_LOG_SIZE
然后,我还建议将其添加到您的内核配置中:
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=4096
此外,我认为您需要在启动参数中添加kmemleak=on
(因为我不确定默认情况下它是否已启用)。
完成所有操作后,即可运行KMEMLEAK工具。
现在,我建议看一下下面链接中给出的示例。他们帮助我了解了如何使用(API以及如何读取日志):
KMEMLEAK first example
KMEMLEAK second example
第二个工具:SLUB_DEBUG
SLUB_DEBUG对于查找由释放后使用,双重释放和缓冲区溢出错误引起的内存损坏非常有用。
要启用它,您应该更新内核配置:
CONFIG_SLUB_DEBUG=y
CONFIG_SLUB_DEBUG_ON=y
CONFIG_PAGE_POISONING=y
我还建议添加:
CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
CONFIG_DEBUG_PAGEALLOC=y
CONFIG_PAGE_OWNER=y
此外,您可能需要在引导参数中添加以下标志:page_poison=on, slub_debug=FZP
,如果还设置了CONFIG_PAGE_OWNER
,则还需要page_owner=on
。
设置所有调试配置后,您应该看一下下一个示例。这很清楚而且很有用。 SLUB_DEBUG example
祝您好运,找到您的错误!