Есть ли способ поймать запись на защищенную от записи страницу?
Я планирую создать самоподобную объектную систему, в которой вы копируете объект для его создания. (потому что это звучит просто и компактно по сравнению с остальными) Очевидно, что объекты, созданные для этой цели, должны быть каким-то образом защищены от записи. Я видел способ пометить что-то защищенное от записи из заголовков программ в ELF. (RE, RWE, RW -флаги)
Обеспечивает ли это вообще защиту от записи? Я помню, что это должно вызвать ошибку сегментации, это правда? Как поймать запись на защищенную от записи страницу. Это хороший способ реализовать то, чего я хочу, и есть ли лучший способ?





Да, вы можете использовать mprotect.
Да, запись в защищенную память вызовет segfault. Вы можете установить обработчик, например в C++:
std::signal(SIGSEGV, my_segv_handler_func);
Это правдоподобный способ делать то, что вы хотите, хотя вам придется добавить много дополнительных средств управления, чтобы это работало. Например, такое обнаружение записи выполняется аппаратно, а на архитектурах x86 размер страницы составляет 4 КБ. Таким образом, вы можете защищать объекты размером 4 КБ за раз, выровненные по границам 4 КБ, а не обычное «начать с адреса X и пройти N байтов». Я считаю, что тебе либо придется
Я не знаю, есть ли способ получше, но играть с ним весело. :)