我有一个现有程序,需要通过IPC与之通信。我可以修改其中的一小部分,但是不能添加共享存储,管道或套接字之类的奇特解决方案。因此,我想与直接读取/写入程序地址空间的函数进行通讯:
process_vm_writev
在Linux上WriteProcessMemory
在Windows上mach_vm_write
在macOS上如果我使用以下功能之一修改内存中的值,旧值的可能缓存的副本是否无效?可变指针是否足以立即检索新值?
答案 0 :(得分:1)
WriteProcessMemory
会很乐意按照所告诉的去做。它写入内存,然后CPU缓存将以逻辑上有效(但未指定)的状态结束。
但是,请注意,其他程序没有意识到这些写操作。而且,如果它有自己的缓存概念,包括在寄存器中缓存变量值之类的机制,则这些副本将不会被更新。操作系统无法知道每种语言如何实现这种缓存机制,但是出于性能方面的考虑,大多数严肃的编程语言都具有这种机制。
如果写入程序使用C或C ++ volatile
指针,则可以部分缓解这种情况。编译器无法完全消除读取。但是,只要不是可观察的,这些读取就可以与其他指令重新排序。这可能会影响他们的时间安排,从而产生类似于缓存的效果-您的WriteProcessMemory
可能为时已晚。