Quando o processo filho é executado, todas as suas páginas atuais são substituídas por um novo conjunto de páginas correspondente à nova imagem executável (mais heap, pilha, etc.).
Sistemas operacionais modernos implementam o CoW mantendo uma contagem de referência para as páginas físicas compartilhadas entre os processos pai e filho. Se uma página é compartilhada entre pai e filho, a contagem de referência será 2. Uma vez que o processo filho passa por exec, a contagem de referência para as páginas compartilhadas é decrementada (por exemplo, é de volta para 1), portanto, qualquer operação de gravação pelo processo pai terá sucesso sem CoW.
Para sua diversão, crie um programa simples que bifurque seguido pelo processo filho dormindo por alguns segundos e depois fazendo e exec. Agora observe o conteúdo de /proc/PID/smaps
de ambos os processos antes de fork (somente pai, é claro), depois de fork antes de exec e depois de exec. Preste atenção nas páginas Shared_XXX e nos intervalos de endereços correspondentes.
Em termos de código, existem algumas extensões XV6 simples para suportar o copy-on-write. Uma simples pesquisa no google pode ser suficiente. Outro local para analisar pode ser o link . Comece a rastreá-lo a partir da entrada do garfo e divirta-se.
Fork is rather simple, once you get the hang of it, but the memory management can be a bitch. See 'mm/memory.c': 'copy_page_range()'