WriteProcessMemory 和类似函数是不是会使可能缓存的数据无效?

Posted

技术标签:

【中文标题】WriteProcessMemory 和类似函数是不是会使可能缓存的数据无效?【英文标题】:Do WriteProcessMemory and similiar functions invalidate the possibly cached data?WriteProcessMemory 和类似函数是否会使可能缓存的数据无效? 【发布时间】:2018-11-07 15:07:34 【问题描述】:

我有一个需要通过 IPC 与之通信的现有程序。我可以修改其中的一小部分,但不能添加任何花哨的解决方案,如共享内存、管道或套接字。所以我想与直接读/写程序地址空间的函数进行通信:

process_vm_writev 在 Linux 上 WriteProcessMemory 在 Windows 上 mach_vm_write 在 macOS 上

如果我使用这些函数之一修改内存中的值,旧值的可能缓存副本是否无效?如果不是,那么 volatile 指针是否足以立即检索新值?

【问题讨论】:

我没有使用这些的经验,但是出于重入的原因,您需要一些进程之间的同步方式。也许那个同步“东西”(共享互斥锁?)包括内存屏障?必须将整个缓冲区声明为 volatile 听起来有点过激。 是的,我对这个想法并不“满意”——一点也不。时间问题可能比比皆是。 即使是 1 字节的信号量,我也需要修改后的值立即可供子进程使用。正如我所说,子进程非常有限(在模拟器中运行)。 我怀疑每个操作系统的答案都会大不相同,所以也许您可以将其限制为仅一个操作系统?如果需要,稍后再问几个问题。 【参考方案1】:

WriteProcessMemory 会很高兴地按照它所说的去做。它写入内存,之后 CPU 缓存将处于逻辑有效(但未指定)状态。

但是,请注意,其他程序不会意识到这些写入。如果它有自己的缓存理念,包括在寄存器中缓存变量值等机制,那么这些副本将不会被更新。操作系统无法知道每种语言如何实现这种缓存机制,但性能问题决定了大多数严肃的编程语言都有这样的机制。

如果写入程序使用 C 或 C++ volatile 指针,则可以部分缓解。编译器无法完全消除读取。但是,只要这些指令不是可观察的,就可以使用其他指令对此类读取进行重新排序。这可能会影响它们的时间,从而产生类似于缓存的效果 - 您的 WriteProcessMemory 可能为时已晚。

【讨论】:

因此,如果我通过易失性指针访问共享数据并添加内存屏障,我是否有点安全?忽略信号量需要以原子方式读取/写入。 @HenrikS:如果您有这种控制水平,请建立适当的 IPC 渠道。希望编译器完全按照您的想法去做并不是软件工程的坚实基础。

以上是关于WriteProcessMemory 和类似函数是不是会使可能缓存的数据无效?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用带有多级指针和偏移量的 WriteProcessMemory()?

如何接受用户输入的常量并使用 writeprocessmemory?

WriteProcessMemory() 错误 998

delphi XE Berlin ReadProcessMemory WriteProcessMemory

C ++ - ReadProcessMemory 到缓冲区,WriteProcessMemory(在同一缓冲区上具有新值)将缓冲区恢复为旧值

python怎么修改某个内存地址的数据