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