在物理内存中固定偏移处捕获并避免内存损坏

时间:2016-08-31 05:11:56

标签: linux-kernel

我们有一个4字节的内存损坏,总是发生在物理内存中的固定偏移处。 物理帧编号为0x00a4d,偏移量以dc0结尾。

问题1)根据这些信息,我们可以说腐败的物理地址是0x00a4d * PAGE_SIZE(4096)+ dc0 = 0x00A4DDC0。以编程方式,确认实际地址的最佳方法是什么?我们的基于ppc64的系统。

问题2)找出这种内存损坏的最佳方法是什么?我阅读的越多,我就会被越多的选择迷失。我应该使用KASAN,还是CONFIG_DEBUG_PAGEALLOC(debug_guardpage_minorder)选项或HW断点?

问题3)由于我们知道腐败是固定的选择,如果我们要保留/阻止该页面,那么最佳选择又是什么?我遇到的两个是memmap和Reserved memory regions

由于

1 个答案:

答案 0 :(得分:1)

1。)你对物理地址是正确的。

2。)如果你有这种可能性,硬件断点是最好的。你有合适的设备(t32或其他)/调试端口/它是否可以将HW break置于物理地址?

这是更通用和愚蠢的案例,不需要硬件支持:

如果我记得您之前的帖子,您怀疑内核代码是腐败警告。 如果您已经阅读了有关KASAN的任何内容,您可能会提到gcc部分放置了钩子而不是内核代码加载和存储。内核部分提供kasan_store_bla_bla_bla钩子,它处理这个商店的正确性。很可能,默认功能对您没有帮助,但您可以将代码集成到此kasan存储钩子中,这将:

2.1)获取传递给商店kasan hook的虚拟地址

2.2)通过这样的页面表查找适当的物理地址(更方便的API存在,但我不记得函数名称):

 pgd_t *pgd = pgd_offset(mm, addr);
 pud_t *pud = pud_offset(pgd, addr);
 pmd_t *pmd = pmd_offset(pud, addr);
 ...

我记得您在上一篇文章中发现用户空间应用程序崩溃,因此您需要从任务列表中检查所有进程mms。

2.3)将找到的物理地址与给定物理地址进行比较,并检查写入的值是否为零(我记得您之前的帖子)

2.4)如果匹配打印回溯所有核心并停止执行。

相关问题