Насколько надежно отслеживание записи страниц в Windows с учетом кэшей процессора

Всегда ли в ::GetWriteWatch обновляется список измененных страниц? Или это возможно из-за кэшей процессора, что некоторые страницы все еще считаются неизмененными, потому что кэшированные записи не были сброшены в основную память?


Рассмотрим следующий фрагмент кода C ++:

auto ptr = ::VirtualAlloc(NULL, 8192, MEM_COMMIT | MEM_RESERVE, MEM_WRITE_WATCH);
auto num = new (ptr) int{};
::ResetWriteWatch(ptr, 8192);

// ... calculations that involve writing to 'num' ...

::GetWriteWatch(/* ... */);

Это должно зарезервировать и зафиксировать две страницы виртуальной памяти, изменить первую страницу и, наконец, запросить все измененные страницы.

Гарантируется ли, что первая страница будет отображаться как измененная при вызове ::GetWriteWatch?

12
задан Maarten Bamelis 1 July 2019 в 08:29
поделиться