La totalidad de fork()
se implementa utilizando mmap / copy en escritura.
Esto no solo afecta el montón, sino también las bibliotecas compartidas, la pila, las áreas BSS.
Lo cual, por cierto, significa que fork es una operación extremadamente ligera, hasta que los 2 procesos resultantes (padre e hijo) realmente comiencen a escribir en los rangos de memoria. Esta característica es un contribuyente importante a la letalidad de las bombas de horquilla: terminas con demasiados procesos antes de que el núcleo se sobrecargue con la replicación y diferenciación de la página.
Será difícil encontrar en un sistema operativo moderno un ejemplo de una operación en la que el núcleo realice una copia impresa (los controladores de dispositivo son la excepción): es mucho, mucho más fácil y más eficiente emplear la funcionalidad de VM.
Even execve()
es esencialmente "por favor mmap el binario / ld.so / whatnot, seguido de ejecutar" - y la VM maneja la carga real del proceso a la RAM y la ejecución. Las variables locales no inicializadas terminan siendo mapeadas desde una 'página cero' - página especial de solo lectura de copia-escritura que contiene ceros, las variables locales inicializadas terminan siendo mapeadas (copia-sobre-escritura, nuevamente) del archivo binario mismo, etc.