O que você vai aprender
Caracterizar o núcleo e o que o torna privilegiado.
Comparar as arquiteturas monolítica, microkernel e em camadas.
Descrever o percurso completo de uma chamada de sistema.
Estimar o custo de uma travessia usuário-núcleo e suas consequências de projeto.
Seu programa não pode tocar no disco
Escreva printf("oi") e o texto aparece na tela. Mas o seu programa não tem permissão para falar com a placa de vídeo. Nenhum programa de usuário tem.
Entre a sua linha de código e o hardware existe uma fronteira vigiada pelo próprio processador. Atravessá-la tem um nome, um custo e um mecanismo — e é isso que dá ao sistema operacional o poder de ser árbitro em vez de mera biblioteca.
Roteiro da aula
O kernel
Tudo o que exige privilégio passa pelo kernel: programar o controlador de disco, alterar a tabela de páginas, mascarar interrupções. Bibliotecas e aplicativos ficam em modo usuário e dependem do kernel para essas operações.
Estruturas de kernel
Há várias formas de organizar o código do kernel, com diferentes trade-offs entre desempenho e robustez:
| Estrutura | Ideia | Trade-off |
|---|---|---|
| Monolítico | Tudo em um grande kernel | Rápido, porém menos isolado (Linux) |
| Microkernel | Mínimo no núcleo; serviços em modo usuário | Robusto, porém com overhead de mensagens |
| Híbrido | Mistura dos dois | Equilíbrio (Windows NT, macOS) |
Monolítico vs. microkernel na falha de um driver
| Cenário | Monolítico | Microkernel |
|---|---|---|
| Driver de rede trava | Pode derrubar o kernel inteiro | É só um processo de usuário: pode reiniciar isolado |
| Chamar o driver | Função direta (rápido) | Troca de mensagens (mais lento) |
| Adicionar driver | Módulo no kernel | Novo servidor em modo usuário |
É por isso que sistemas críticos (aviônica, automotivo) frequentemente preferem microkernels: o isolamento contém falhas.
Chamada de sistema: a única porta
Trap. A instrução que provoca, de propósito, a mudança para modo núcleo —
syscall no x86-64, svc no ARM.Repare no detalhe decisivo: o programa não escolhe para onde o processador salta. O endereço de entrada foi configurado pelo núcleo durante o boot. O programa só consegue dizer o quê quer, nunca onde ir. É essa assimetria que torna a proteção possível.
Chamada de biblioteca não é chamada de sistema
Confusão clássica. Quando você escreve printf, chama uma função da biblioteca C — código comum, em modo usuário. Ela formata o texto e, só quando o buffer enche ou você pede, executa write(), essa sim uma chamada de sistema.
| Chamada de biblioteca | Chamada de sistema | |
|---|---|---|
| Onde roda | Modo usuário | Modo núcleo |
| Troca de modo | Não | Sim |
| Custo típico | Nanossegundos | Centenas de nanossegundos a microssegundos |
| Exemplo | printf, malloc | write, fork, open |
write() com 4 KB custa quase o mesmo que uma com 1 byte. Agrupar é a otimização.O mesmo trabalho, dois custos
Mesmo resultado na tela. A primeira versão gasta cerca de 600 ms; a segunda, 0,18 ms — mais de três mil vezes mais rápida, sem mudar uma linha de lógica. O custo não está no trabalho, está na fronteira.
Passo a passo: uma write() do início ao fim
write(fd, buf, 4096) — ainda é código de biblioteca, em modo usuário.buf pertence mesmo a este processo?write() retornar com sucesso não significa que o dado está no disco. Para essa garantia é preciso fsync() — detalhe que reaparece na U8, ao estudarmos consistência e journaling.Atravesse a fronteira você mesmo
No simulador abaixo, escolha uma chamada e avance passo a passo. Acompanhe em qual modo o processador está a cada instante. A última opção é uma instrução privilegiada executada na marra: veja o que o hardware faz com ela.
Revisão relâmpago
Verifique seu entendimento
Um programa acessa um endereço de memória cuja página não está na RAM. Que tipo de evento ocorre?
Onde os alunos tropeçam
• Chamar toda falha de "interrupção" — divisão por zero é exceção, não interrupção.
• Achar que a syscall é "uma função normal" — ela cruza a fronteira de privilégio via trap, com custo real.
• Escrever ISRs longas que bloqueiam outras interrupções e arruínam a latência de tempo real.
Boas práticas de E/S
Revele a resposta
Por que microkernels podem ser mais lentos que monolíticos?
Como isto se liga ao curso
Esta aula é a engrenagem central:
- O timer que vimos na Aula 1 é a interrupção que viabiliza a preempção do escalonador (Aula 5).
- A falta de página (exceção) é a base da memória virtual (Aulas 8–9).
- As ISRs reaparecem nos drivers e na E/S por interrupção (Aula 10).
Resumo da aula
Atividade em grupo · Contando travessias
Em duplas, meçam quantas chamadas de sistema programas comuns realmente fazem.
Roteiro
- Executem
strace -c lse anotem o total de chamadas e as três mais frequentes. - Repitam com
strace -c ls -R /usre comparem os números. - Escrevam um programa que imprime 4096 caracteres um a um e outro que imprime tudo de uma vez; meçam ambos.
- Expliquem a diferença de tempo usando o conceito de custo de travessia.
Mini-quiz · Aula 3
20 questões sobre esta aula. Escolha e veja a explicação na hora.
📌 Resumo — leve isto para a prova
- O núcleo é a única parte do sistema que roda em modo privilegiado.
- Monolítico troca isolamento por desempenho; microkernel faz o inverso.
- A chamada de sistema é a única porta oficial, e quem define o ponto de entrada é o núcleo, não o programa.
- Chamada de biblioteca roda em modo usuário; chamada de sistema atravessa a fronteira e custa muito mais.
- Agrupar operações de E/S é a otimização mais rentável justamente porque a travessia é o caro.