内存块上的C写/读检测

时间:2012-05-22 11:45:57

标签: c linux posix mprotect

我想问一下是否有人知道如何检测对alloc内存地址的写入。

首先,我使用了mprotect和sigaction来强制执行写/读操作时出现分段错误。

这种方法有两个负面因素:

  • 难以通过分段错误
  • mprotect中的内存地址传递必须与页面边界对齐,即使用简单的malloc不能处理此内存地址。

澄清问题:

我在C中为集群环境构建一个应用程序。在某些时候,我分配内存,我在本地主机中调用缓冲区并分配一些数据。此缓冲区将发送到远程节点并具有相同的过程。同时这个缓冲区将在远程节点中写入/读取但我不知道何时(它将使用DMA来写入/读取缓冲区),必须通知本地主机有关缓冲区修改的信息。就像我上面所说,我已经使用了一些机制,但没有一个 它有能力处理它。现在我只想要一些想法。

每个不同的想法都受到欢迎。

谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用硬件断点。缺点是这是特定于硬件的,只能设置有限数量的断点。此外,大多数情况下此类设施不是特定于任务的,因此如果您运行该程序的多个实例,它们将共享可用“插槽”的数量。

x86架构具有调试寄存器,可用于设置硬件内存断点(请参阅:http://en.wikipedia.org/wiki/X86_debug_register)。

如果要对此进行测试,可以使用GDB设置硬件断点。您可以使用GDB的'watch'命令在变量上放置硬件内存断点。

请注意,使用调试寄存器和mprotect()只是让你完成工作的方法,我不认为它们是做内存管理的合理工程实践(你可能在这里尝试做什么) )。也许你可以解释一下你在更高层次上做的事情:http://catb.org/esr/faqs/smart-questions.html#goal