Aula 21: Gerenciamento de Memória e Ambientes de Runtime
Objetivos
- Entender o layout de memória de um processo.
- Stack Frames e Calling Conventions.
Conteúdo
Para que funções chamem umas às outras, precisamos de um contrato estrito sobre como a memória é usada. Isso é o Ambiente de Runtime.
Layout de Memória
- Text (Code): Instruções (Read-Only).
- Data/BSS: Variáveis globais e estáticas.
- Heap: Alocação dinâmica (
new,malloc). Vida útil indefinida. - Stack: A memória de trabalho das funções.
A Pilha (Stack)
A Stack é uma pilha de Registros de Ativação (Activation Records / Frames). Cada vez que uma função é chamada, um novo Frame é empilhado. Ele contém: - Parâmetros: Argumentos passados para a função. - Endereço de Retorno: Onde continuar a execução após o retorno. - Link Dinâmico (Saved Base Pointer): Ponteiro para o frame do chamador. - Variáveis Locais: Espaço para variáveis declaradas na função. - Spill Area: Espaço para registradores que precisaram ser “despejados” da CPU.
Convenção de Chamada (Calling Convention)
Define quem faz o quê (Ex: cdecl, stdcall, x86-64 System V). - Quem limpa a pilha? (Caller vs Callee). - Onde vão os argumentos? (Registradores RDI, RSI… ou na Pilha?). - Quais registradores devem ser preservados? (Callee-saved vs Caller-saved).
Referências
- Aho, A. V., Lam, M. S., Sethi, R., & Ullman, J. D. (2006). Compilers: Principles, Techniques, and Tools.
- Cooper, K., & Torczon, L. (2011). Engineering a Compiler.