Memory management Linux页面中毒

Memory management Linux页面中毒,memory-management,linux-kernel,arm,Memory Management,Linux Kernel,Arm,我正在从事armlinux。当我们启用CONFIG\u PAGE\u toxing时,页面在free\u pages()之后填充有毒字节模式,并在alloc\u pages()之前验证有毒模式 通过在分配新页面之前验证有害字节模式,这有助于我识别位翻转或页面内存损坏。但是如何识别罪犯呢?我在谷歌上搜索,但没有找到。我知道这是一个老问题,但我刚刚遇到了一个类似的问题,我花了一段时间调试它。因此,我将在此推荐两种对我非常有用的工具(我同时使用了这两种工具): 第一个工具:KMEMLEAK 为了启用它

我正在从事
armlinux
。当我们启用
CONFIG\u PAGE\u toxing
时,页面在
free\u pages()
之后填充有毒字节模式,并在
alloc\u pages()
之前验证有毒模式


通过在分配新页面之前验证有害字节模式,这有助于我识别位翻转或页面内存损坏。但是如何识别罪犯呢?我在谷歌上搜索,但没有找到。

我知道这是一个老问题,但我刚刚遇到了一个类似的问题,我花了一段时间调试它。因此,我将在此推荐两种对我非常有用的工具(我同时使用了这两种工具):

第一个工具:KMEMLEAK

为了启用它,您必须在内核配置中启用它:

CONFIG_HAVE_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=4096
CONFIG_SLUB_DEBUG=y
CONFIG_SLUB_DEBUG_ON=y
CONFIG_PAGE_POISONING=y
如果您得到这个内核日志:

kmemleak: Kernel memory leak detector disabled
kmemleak: Early log buffer exceeded (xxxx), please increase DEBUG_KMEMLEAK_EARLY_LOG_SIZE
然后,我还建议将其添加到内核配置中:

CONFIG_HAVE_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=4096
CONFIG_SLUB_DEBUG=y
CONFIG_SLUB_DEBUG_ON=y
CONFIG_PAGE_POISONING=y
此外,我认为您需要将
kmemleak=on
添加到启动参数中(因为我不确定它在默认情况下是否启用)

所有这些之后,KMEMLEAK工具就可以运行了。
现在我建议看一下下面链接中给出的示例。他们帮助我了解了如何使用API(以及如何读取其日志):

第二个工具:SLUB_DEBUG

SLUB_调试对于查找空闲、双空闲和缓冲区溢出错误后使用导致的内存损坏非常有用

为了启用它,您应该更新内核配置:

CONFIG_HAVE_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK=y
CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=4096
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\u poison=on,slub\u debug=FZP
,如果您还设置了
CONFIG\u page\u OWNER
,则还需要
page\u OWNER=on

设置完所有调试配置后,您应该看看下一个示例。它清晰而有用。


祝你好运找到你的bug

好的配置页面只会有助于发现某些东西改变了未分配的内存。找到罪犯是另一个问题。有太多的事情会导致这样的事情。是的。我知道还有很多其他东西可能会破坏页面。但是作为一名开发人员,我们应该识别问题并加以解决,不是吗。在这种情况下应该采取什么方法?如果它是可重复的,您可以
取消映射
内存或映射为只读;无论谁写都会出错。这可能是硬件缺陷,Linux(或ARM CPU)无法检测到这一点。例如,它可能是DMA,可能是SDRAM线路在写入某个位模式时出现故障,可能是电源问题。