A totalidade da fork()
é implementado usando mmap / copiar na escrita.
Isso não afeta apenas o heap, mas também as bibliotecas compartilhadas, a pilha e as áreas BSS.
O que, aliás, significa que o fork é uma operação extremamente leve, até que os 2 processos resultantes (pai e filho) realmente comecem a gravar em intervalos de memória. Esse recurso é um dos principais contribuintes para a letalidade de fork-bombs - você acaba com muitos processos antes que o kernel fique sobrecarregado com a 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 (os drivers de dispositivo são a exceção) - é apenas muito, muito mais fácil e mais eficiente empregar a funcionalidade de VM.
Even execve()
é essencialmente "por favor, mapeie o binário / ld.so / whatnot, seguido de execute" - e a VM lida com o carregamento real do processo na RAM e na execução. Variáveis locais não inicializadas acabam sendo mamapedadas de uma 'página zero' - página especial de leitura e gravação somente para leitura contendo zeros, variáveis inicializadas locais acabam sendo mmapedadas (cópia na gravação, novamente) do próprio arquivo binário, etc.