A totalidade de fork()
é implementada usando mmap / copy na gravação.
Isso não afeta apenas o heap, mas também as bibliotecas compartilhadas, pilha, áreas BSS.
O que, aliás, significa que fork é uma operação extremamente leve, até que os 2 processos resultantes (pai e filho) realmente começam a gravar nos intervalos de memória. Este recurso é um grande contribuidor para a letalidade de fork-bombs - você acaba com muitos processos antes que o kernel seja sobrecarregado com replicação e diferenciação de páginas.
Você terá dificuldade em encontrar em um sistema operacional moderno um exemplo de operação em que o kernel executa uma cópia impressa (sendo os drivers de dispositivos a exceção) - é muito mais fácil e eficiente empregar a funcionalidade da VM.
Mesmo execve()
é essencialmente "por favor mmap o binário / ld.so / whatnot, seguido de executar" - e a VM manipula o carregamento real do processo para RAM e execução. As variáveis locais não inicializadas acabam sendo mmapadas de uma 'página zero' - página especial de copy-on-write de somente leitura contendo zeros, variáveis locais inicializadas acabam sendo mmaped (copy-on-write, novamente) do próprio arquivo binário, etc.