Aula 21: Gerenciamento de Memória e Ambientes de Runtime

Data de Publicação

25/03/2026

Data de Modificação

08/03/2026

Objetivos

  • Entender o layout de memória de um processo.
  • Stack Frames e Calling Conventions.

Motivação em Engenharia de Computação

Compiladores não existem no vácuo: eles precisam respeitar o modelo de execução e as convenções da plataforma alvo.

Para quem projeta sistemas embarcados, sistemas operacionais ou firmware, compreender ambientes de runtime é essencial para:

  • Garantir uso eficiente da memória (stack vs heap).
  • Implementar chamadas de sistema e interrupções de forma correta.
  • Interagir com bibliotecas e código legado escrito em C/C++.

Conteúdo

Para que funções chamem umas às outras, o compilador e o sistema seguem um contrato sobre uso de memória: layout do processo, pilha de ativação e convenção de chamada. Esse é o ambiente de runtime.

flowchart TB
  subgraph processo [Espaço de endereços]
    Text[Text código]
    Data[Data/BSS]
    Heap[Heap]
    Stack[Stack]
  end

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).

Resumo

  • Layout: Text, Data/BSS, Heap, Stack. Cada chamada de função empilha um frame (parâmetros, endereço de retorno, variáveis locais, área de spill).
  • Convenção de chamada (ABI) define quem passa argumentos, quem limpa a pilha e quais registradores são preservados; o compilador deve respeitá-la.

Referências

  • Aho et al. (2006); Cooper & Torczon (2011).

Materiais da aula

Última atualização: 08/03/2026

De volta ao topo