Я не знаю эквивалент VirtualQuery
на Linux. Но некоторые другие способы сделать это, который может или не может работать:
Вы устанавливаете обработчик сигналов, захватывающий SIGBUS/SIGSEGV, и продолжаете Ваше чтение или запись. Если память будет защищена, то Ваш код захвата сигнала назовут. Если не Ваш код захвата сигнала не называют. Так или иначе Вы побеждаете.
Вы могли отследить каждый раз, когда Вы называете mprotect
и создаете соответствующую структуру данных, которая помогает Вам в знании, если регион читается или защищается от записи. Это хорошо, если у Вас есть доступ ко всему коду, который использует mprotect
.
можно контролировать весь mprotect
вызовы в процессе путем соединения кода с библиотекой, переопределяющей функцию mprotect
. Можно затем создать необходимую структуру данных для знания, если регион читается или защищается от записи, и затем назовите систему mprotect
для того, чтобы действительно установить защиту.
можно попытаться использовать /dev/inotify
и контролировать файл /proc/self/maps
для любого изменения. Я предполагаю, что этот не работает, но должен стоить попытки.