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

  1. Text (Code): Instruções (Read-Only).
  2. Data/BSS: Variáveis globais e estáticas.
  3. Heap: Alocação dinâmica (new, malloc). Vida útil indefinida.
  4. 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.
Back to top