¿Puedo proteger contra escritura cada página en el espacio de direcciones de un proceso de Linux?

Me pregunto si hay una manera de proteger contra escritura cada página en el espacio de direcciones de un proceso de Linux (desde el interior del proceso en sí, a modo demprotect()) Por "cada página", realmente me refiero a cada página del espacio de direcciones del proceso que podría escribir un programa ordinario que se ejecuta en modo de usuario, por lo tanto, el texto del programa, las constantes, las variables globales y el montón, pero yo estaría contento con solo constantes, globales y montón. No quiero proteger la pila contra escritura, eso parece una mala idea.

Un problema es que no sé por dónde comenzar la memoria de protección contra escritura. Mirando a/proc/pid/maps, que muestra las secciones de memoria en uso para un pid dado, siempre parecen comenzar con la dirección0x08048000, con el texto del programa. (En Linux, por lo que puedo decir, la memoria de un proceso se presenta con el texto del programa en la parte inferior, luego las constantes por encima de eso, luego los globales, luego el montón, luego un espacio vacío de tamaño variable dependiendo del tamaño del montón o pila, y luego la pila crece desde la parte superior de la memoria en la dirección virtual0xffffffff.) Hay una manera de saber dónde está la parte superior del montón (llamando asbrk(0), que simplemente devuelve un puntero al "descanso" actual, es decir, la parte superior del montón), pero no es realmente una forma de saber dónde comienza el montón.

Si trato de proteger todas las páginas de0x08048000 hasta el descanso, eventualmente obtengo unmprotect: Cannot allocate memory error. No se porquemprotect estaría asignando memoria de todos modos, y Google no es muy útil. ¿Algunas ideas?

Por cierto, la razón por la que quiero hacer esto es porque quiero crear una lista de todas las páginas en las que se escribe durante la ejecución del programa, y la forma en que se me ocurre hacer esto es proteger contra escritura páginas, deje que cualquier intento de escritura provoque un error de escritura, luego implemente un controlador de error de escritura que agregará la página a la lista y luego eliminará la protección contra escritura. Creo que sé cómo implementar el controlador, si tan solo pudiera averiguar qué páginas proteger y cómo hacerlo.

¡Gracias!

Respuestas a la pregunta(2)

Su respuesta a la pregunta