我有一个现有程序需要通过 IPC 进行通信。我可以修改它的一小部分,但不能添加任何花哨的解决方案,如共享内存、管道或套接字。所以我想与直接读取/写入程序地址空间的函数进行通信:
process_vm_writev
在 Linux 上WriteProcessMemory
在 Windows 上mach_vm_write
在 macOS 上
如果我使用这些函数之一修改内存中的值,旧值的可能缓存拷贝是否失效?如果不是,volatile 指针是否足以立即检索新值?
最佳答案
WriteProcessMemory
会很高兴地完全按照它告诉的去做。它写入内存,之后 CPU 缓存将以逻辑上有效(但未指定)的状态结束。
但是,请注意其他程序并不知道这些写入。如果它有自己的缓存想法,包括在寄存器中缓存变量值等机制,那么这些拷贝将不会被更新。操作系统无法知道每种语言如何实现这种缓存机制,但性能问题决定了大多数严肃的编程语言都具有这样的机制。
如果写入的程序使用 C 或 C++ volatile
指针,则可以部分缓解这种情况。编译器无法完全消除读取。但是,只要这些指令不可可观察,就可以使用其他指令对此类读取进行重新排序。这可能会影响它们的计时,从而产生类似于缓存的效果 - 您的 WriteProcessMemory
可能来不及了。
关于c++ - WriteProcessMemory 和类似函数是否会使可能缓存的数据无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53192201/