A memória virtual é fornecida pela MMU , um componente de hardware. Apenas o kernel tem permissão para modificar a configuração da MMU. A configuração da MMU determina qual endereço físico (se houver) corresponde a cada endereço virtual e quais permissões o programa tem nesse endereço (pelo menos leitura ou leitura-gravação, os recursos exatos dependem da arquitetura de hardware).
O kernel pode evitar que um processo grave em um pedaço de memória virtual, garantindo que esses endereços sejam mapeados somente para leitura ou não mapeados.
Se este é o dever de casa, talvez seja interessante explicar como funciona a MMU em sua arquitetura e, em particular, como usar diretórios de nível superior (seções, tabelas L1 / L2 ou o que quer que sejam chamados em sua arquitetura) em oposição aos diretórios de nível inferior (L2 / L3).