Como você disse, o vm_area_struct
informa em qual área de memória ocorreu a falha e os sinalizadores de proteção estão contidos nessa estrutura. A função __do_page_fault
chama find_vma
para obter um ponteiro para o vm_area_struct
. Essa estrutura é então passada via handle_pte_fault
até do_swap_page
(no parâmetro vm_fault *vmf
), que chama mk_pte
com os bits de proteção como parâmetro.
Seu outro problema: se uma página COW for trocada e um processo quiser gravar nela. Nesse caso, você recebe uma falha de página porque a página é desativada. O manipulador cuida da situação e o processo entra em suspensão até que a página seja lida do disco. Quando o processo está agendado para ser executado novamente, ele re-executa a instrução de gravação com falha e o BANG! - recebemos uma nova falha, desta vez, uma vez que a página é somente leitura por causa da cópia na gravação.