В Linux (или Solaris) есть лучший способ, чем ручной разбор /proc/self/maps
, чтобы выяснить, можете ли вы читать, записывать или выполнять все, что хранится по одному или нескольким адресам в памяти?
Например, в Windows у вас есть VirtualQuery
.
В Linux я могу mprotect
изменить эти значения, но я не могу их прочитать.
Кроме того, есть ли способ узнать, когда эти разрешения изменяются (например, когда кто-то использует mmap
в файле за моей спиной), кроме как что-то ужасно инвазивное и используя ptrace
для всех потоков в процессе и перехватывая любые попытаться сделать syscall
, который может повлиять на карту памяти?
Update:
К сожалению, я использую это внутри JIT, у которого очень мало информации о коде, который он выполняет, чтобы получить приближение к тому, что является постоянным. Да, я понимаю, что могу иметь постоянную карту изменчивых данных, например, страницу vsyscall, используемую Linux. Я могу смело откинуться на предположение, что все, что не включено в начальный синтаксический анализ, изменчиво и опасно, но я не совсем доволен этой возможностью.
Прямо сейчас, что я делаю, я читаю /proc/self/maps
и строю структуру, через которую я могу выполнить двоичный поиск для определенной защиты адреса. Каждый раз, когда мне нужно что-то знать о странице, которая не входит в мою структуру, я перечитываю /proc/self/maps, предполагая, что она была добавлена тем временем, или я собираюсь все равно segfault.
Кажется, что разбор текста, чтобы получить эту информацию и не зная, когда он изменится, ужасно крут. (/dev/inotify
не работает почти ничего в /proc
)