Posso proteger contra gravação todas as páginas no espaço de endereço de um processo Linux?

Gostaria de saber se existe uma maneira de proteger contra gravação todas as páginas no espaço de endereço de um processo Linux (de dentro do próprio processo, por meio demprotect()) Por "cada página", eu realmente quero dizer todas as páginas do espaço de endereçamento do processo que podem ser gravadas por um programa comum em execução no modo de usuário - portanto, o texto do programa, as constantes, as globais e a pilha - mas eu ficaria feliz com apenas constantes, globais e heap. Não quero proteger a pilha contra gravação - isso parece uma má ideia.

Um problema é que não sei por onde começar a memória de proteção contra gravação. Olhando para/proc/pid/maps, que mostra as seções da memória em uso para um determinado pid, elas sempre parecem começar com o endereço0x08048000, com o texto do programa. (No Linux, até onde eu sei, a memória de um processo é organizada com o texto do programa na parte inferior, depois as constantes acima disso, as globais, a pilha e um espaço vazio de tamanho variável, dependendo do tamanho da pilha ou pilha e, em seguida, a pilha crescendo da parte superior da memória no endereço virtual0xffffffff.) Existe uma maneira de saber onde está o topo da pilha (chamandosbrk(0), que simplesmente retorna um ponteiro para a "interrupção" atual, ou seja, a parte superior da pilha), mas não é realmente uma maneira de saber onde a pilha começa.

Se eu tentar proteger todas as páginas de0x08048000 até o intervalo, eu finalmente recebo umamprotect: Cannot allocate memory erro. Não sei porquemprotect estaria alocando memória de qualquer maneira - e o Google não ajuda muito. Alguma ideia?

A propósito, o motivo pelo qual desejo fazer isso é porque quero criar uma lista de todas as páginas gravadas durante uma execução do programa, e a maneira que posso pensar em fazer isso é proteger todos os páginas, permita que qualquer tentativa de gravação cause uma falha de gravação, implemente um manipulador de falhas de gravação que adicione a página à lista e remova a proteção contra gravação. Eu acho que sei como implementar o manipulador, se eu pudesse descobrir quais páginas proteger e como fazê-lo.

Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion