Camada Zero · 14 · Memória Virtual & Paginação

Quando seu programa lê o endereço 0x400000, ele não está falando com a RAM de verdade. Tem uma camada de tradução no meio que dá a cada processo a ilusão de ter a máquina inteira só pra ele. Acompanhe a página virar frame, a TLB acelerar, e o page fault doer.
🖥️
Essa aula é pra mexer no computador
O visualizador é interativo e fica muito melhor numa tela grande. Abra no desktop pra rodar e ver o custo acontecer. A teoria, o código em Go e o Desafio seguem aqui embaixo, dá pra ler tranquilo no celular.

Virtual (P0)

Page Table

RAM física (frames)

TLB (cache de traduções, FIFO máx 4)

0Page faults
0TLB hits
0TLB misses
P0 P1 traduzindo agora page fault
A memória virtual dá a cada processo um espaço de endereços privado e contíguo. A MMU traduz cada acesso (página virtual → frame físico) usando a page table do processo, e a TLB guarda as traduções recentes pra não percorrer a tabela toda hora. Se a página não está na RAM, dá page fault: o SO busca do disco. Três ganhos de uma vez: isolamento entre processos, ilusão de espaço contíguo, e usar mais memória que a RAM física (swap).

A tradução (conceitual)

// endereço virtual = (página, offset)
traduz(proc, vaddr):
    pagina, off := vaddr / PAGE, vaddr % PAGE
    if tlb[proc, pagina] existe:
        frame := tlb[proc, pagina]      // TLB hit (rápido)
    else:
        frame := pageTable[proc][pagina] // percorre a tabela
        if frame == nil:
            frame = pageFault(proc, pagina) // busca no disco
        tlb[proc, pagina] = frame
    return frame*PAGE + off

No mundo Go

// Você não vê page tables, mas sente os efeitos:
debug.SetMemoryLimit(512 << 20) // 512 MiB (GOMEMLIMIT)
// passou do limite do container? OOM killer mata o processo.
// working set > RAM? swap e thrashing: latência despenca.

🧠 Desafio — Memória Virtual

Acesse páginas e provoque um page fault aqui de cima antes de responder. As duas últimas são de reflexão: escreve a sua e só então revela o modelo.