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.

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.