Делают ли функции WriteProcessMemory и подобные функции недействительными возможно кэшированные данные? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть существующая программа, с которой мне нужно общаться через IPC. Я могу изменить его мелкие детали, но не могу добавить какие-нибудь причудливые решения, такие как общая память, каналы или сокеты Поэтому я хотел бы общаться с функциями, которые непосредственно читают / пишут в адресное пространство программ:

  • process_vm_writev на Linux
  • WriteProcessMemory на окнах
  • mach_vm_write в macOS

Если я изменю значение в памяти с помощью одной из этих функций, возможно, станет ли кэшированная копия старого значения недействительной? Если нет, достаточно ли изменчивого указателя для немедленного получения нового значения?

1 Ответ

0 голосов
/ 07 ноября 2018

WriteProcessMemory с радостью сделает именно то, что ему говорят. Он записывает в память, и кэш (-ы) ЦП в конечном итоге окажутся в логически допустимом (но не указанном) состоянии.

Однако имейте в виду, что другая программа не уведомлена об этих записях. И если у него есть своя собственная идея кэширования, включая такие механизмы, как кэширование значений переменных в регистрах, то эти копии НЕ будут обновляться. Не существует способа, которым ОС может знать, как каждый язык реализует такие механизмы кэширования, но проблемы производительности диктуют, что большинство серьезных языков программирования имеют такие механизмы.

Если написанная программа использует указатели C или C ++ volatile, это частично смягчается. Компилятор не может полностью исключить чтение. Однако такие чтения могут быть переупорядочены с помощью других инструкций, если они не наблюдаемые . Это может повлиять на их время, что дает эффект, аналогичный кешированию - ваш WriteProcessMemory может быть слишком поздно.

...