O Linux não "cria automaticamente" uma região para os segmentos de pilha e pilha.
Nas linguagens de programação, há sempre um ponto de entrada, onde o controle é transferido do sistema operacional para o programa. Em C, esta é a função main()
.
Cada processo no Linux possui um mapeamento de memória de 4 GB em 32 bits e 8 TB em ambientes de 64 bits. Essa é a quantidade máxima de memória que é possível endereçar pelo sistema operacional. Observe que isso é independente de quantas memórias físicas seu sistema realmente possui. Todo processo está dando a ilusão de que está sozinho no computador.
Antes de chamar main()
, o sistema operacional envia os elementos da linha de comando, que foi usada para invocar o programa, no "topo" da pilha inicialmente vazia, é onde o segmento da pilha é. Se o main()
se chamar uma função, os argumentos de passagem serão colocados no segmento da pilha.
4GB/8TB┌───────────┐
│ stack │ <- main(), argc/argv parameters and functions, growing downwards
├ ─ ─ ─ ─ ─ ┤
│ │
│ │ <- empty
│ │
│ │
├───────────┤
│ data │ <- static data and literal constants
├───────────┤
│ text │ <- all the instructions; the compiled code
0└───────────┘
Agora sua pergunta:
I used
/proc/$$/maps
and before the call to malloc there was no "heap" region.
A memória heap : um processo pode se expandir para a parte não ocupada da memória virtual no tempo de execução usando a chamada do sistema malloc()
. Esta memória alocada dinamicamente está localizada acima de data no segmento de pilha . Portanto, é normal que não haja região ou segmento de heap até a primeira chamada malloc()
.
4GB/8TB┌───────────┐
│ stack │ <- main(), argc/argv parameters and functions, growing downwards
├ ─ ─ ─ ─ ─ ┤
│ │
│ │ <- empty
├ ─ ─ ─ ─ ─ ┤
│ heap │ <- malloc()'d memory space, growing upwards
├───────────┤
│ data │ <- static data and literal constants
├───────────┤
│ text │ <- all the instructions; the compiled code
0└───────────┘