【问题标题】:C write/read detection on memory block内存块上的 C 写/读检测
【发布时间】:2012-05-28 21:44:42
【问题描述】:

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

起初我使用 mprotect 和 sigaction 在进行写/读操作时强制出现分段错误。

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

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

澄清问题:

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

这里欢迎每一个不同的想法。

谢谢

【问题讨论】:

    标签: c linux posix mprotect


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的建议。也许我表达得不是很好,但这里的想法不是调查特定内存块上可能出现的问题,而是捕获一个内存地址以了解何时执行此内存地址中的读/写操作并像事件一样处理它.最重要的是所有操作都必须在执行时。
    • @Majao:我想我确实理解正确。应该可以从应用程序本身设置调试寄存器,只是正如我所写的那样有一些缺点。我认为您的问题(检测特定内存访问)的唯一解决方案是硬件设施,除了页面级访问限制之外,X86 调试寄存器是您唯一的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 2015-04-01
    • 2010-09-08
    • 2011-05-12
    相关资源
    最近更新 更多