C内存块上的写/读检测

C内存块上的写/读检测,c,linux,posix,mprotect,C,Linux,Posix,Mprotect,我想问一下,是否有人知道如何检测alloc内存地址上的写操作 起初,我使用mprotect和sigaction在执行写/读操作时强制执行分段错误 这种方法的两个不利因素是: 是否难以通过分段故障 mprotect中的内存地址传递必须与页面边界对齐,即不可能使用简单的malloc处理此内存地址 为了澄清问题: 我用C为集群环境构建了一个应用程序。在某些情况下,我会在本地主机中分配我称之为缓冲区的内存,并分配一些数据。此缓冲区将被发送到远程节点,并具有相同的过程。在同一点上,这个缓冲区将在远程节

我想问一下,是否有人知道如何检测alloc内存地址上的写操作

起初,我使用mprotect和sigaction在执行写/读操作时强制执行分段错误

这种方法的两个不利因素是:

  • 是否难以通过分段故障
  • mprotect中的内存地址传递必须与页面边界对齐,即不可能使用简单的malloc处理此内存地址
为了澄清问题:

我用C为集群环境构建了一个应用程序。在某些情况下,我会在本地主机中分配我称之为缓冲区的内存,并分配一些数据。此缓冲区将被发送到远程节点,并具有相同的过程。在同一点上,这个缓冲区将在远程节点中写入/读取,但我不知道何时(它将被DMA用于写入/读取缓冲区),必须通知本地主机缓冲区修改。正如我上面所说,我已经使用了一些机制,但没有一个 它有能力以某种能力处理它。现在我只想知道一些事情

这里欢迎各种不同的想法


谢谢

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

x86体系结构具有调试寄存器,可用于设置硬件内存断点(请参阅)

如果您想测试这一点,可以使用GDB设置硬件断点。可以使用GDB的“watch”命令在变量上放置硬件内存断点


请注意,使用调试寄存器和
mprotect()
只是完成您要求的工作的方法,我不认为它们是执行内存管理的可靠工程实践(您可能会在这里尝试这样做)。也许你可以在更高的层次上解释一下你想做什么:

谢谢你的建议。也许我没有很好地表达出来,但这里的想法不是调查特定内存块上可能出现的错误,而是在内存地址中执行读/写操作时捕获内存地址,并像事件一样处理它。最重要的是,所有的操作都必须在执行时间内。@Majao:我想我对你的理解是正确的。应该可以从应用程序本身设置调试寄存器,但正如我所写的,存在一些缺点。我认为解决您的问题(检测特定内存访问)的唯一解决方案将是硬件设施,除了页面级访问限制之外,X86调试寄存器是您唯一的选择。