Criação da região / segmento da pilha no Linux

3

Entendo que no Linux o carregador de processos não cria automaticamente uma região "heap" para um processo como é o caso da pilha, está correto?

Eu usei /proc/$$/maps e, antes da chamada para malloc() , não havia região "heap".

    
por othman 18.12.2015 / 10:35

1 resposta

4

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└───────────┘
    
por 18.12.2015 / 11:53