Kernel, espaço de usuário e chamadas de sistema

O kernel protege operações que não podem ficar abertas
O kernel é o núcleo privilegiado que controla recursos fundamentais do computador. Ele mantém mecanismos de execução, memória, entrada e saída, arquivos, comunicação e proteção. Aplicações comuns ficam fora desse núcleo e solicitam serviços por interfaces controladas. Uma dessas interfaces é a chamada de sistema, ou system call.
Essa separação resolve um problema essencial: um editor de texto precisa salvar arquivos, mas não deve poder reprogramar livremente o controlador de armazenamento; um navegador precisa receber dados da rede, mas não deve ler a memória privada de qualquer outro processo. O sistema permite a operação necessária sem entregar à aplicação todo o poder usado para realizá-la.
Kernel e sistema operacional não são sinônimos obrigatórios. Conforme explicado em o que é um sistema operacional e para que ele serve, uma plataforma utilizável também reúne bibliotecas, serviços, ferramentas e interfaces executadas fora do núcleo. Nesta aula, o recorte é a fronteira que protege o kernel e permite atravessá-la de forma prevista.
Espaço de usuário e espaço do kernel
Os processadores modernos oferecem níveis de privilégio. O sistema usa essa capacidade para executar código comum em um modo restrito e o núcleo em um modo que pode realizar operações protegidas. Os nomes exatos variam: modo de usuário e modo kernel são termos usuais, enquanto arquiteturas de processador podem descrever anéis ou níveis de exceção.
Espaço de usuário designa o ambiente no qual rodam aplicações e muitos serviços. Um processo normalmente enxerga seu próprio espaço de endereços virtual, sujeito aos mapeamentos e permissões mantidos pelo sistema. Isso reduz a possibilidade de um programa alterar diretamente o código ou os dados de outro.
Espaço do kernel designa a região e o contexto protegidos usados pelo núcleo. Ali ficam estados globais e componentes capazes de controlar memória, processadores e dispositivos. Uma falha nesse domínio tende a ter alcance maior: código privilegiado incorreto pode comprometer todo o sistema, enquanto a falha de uma aplicação isolada costuma ficar limitada ao processo e aos recursos que ele alcança.
A fronteira não significa que aplicações sejam irrelevantes ou que todo software confiável execute no kernel. Pelo contrário: deixar mais código em modo restrito diminui o conjunto de componentes capazes de causar dano sistêmico. Também não significa isolamento absoluto. Processos podem compartilhar memória e trocar mensagens quando usam mecanismos autorizados.
O que é uma chamada de sistema
Uma chamada de sistema é um mecanismo pelo qual um programa solicita ao kernel uma operação que exige seus serviços ou privilégios. Abrir e ler um arquivo, criar um processo, mapear memória, aguardar um evento ou operar um socket são famílias comuns de solicitação.
O programa prepara uma identificação da operação e seus argumentos e executa a sequência prevista pela plataforma. O processador transfere o controle para um ponto de entrada do kernel e muda o nível de privilégio. O núcleo identifica a solicitação, valida dados e estado, realiza ou inicia o serviço e devolve resultado ou erro ao contexto menos privilegiado.
Essa descrição é propositalmente geral. A instrução usada, os registradores que transportam argumentos, as tabelas internas e as convenções de retorno dependem do sistema operacional e da arquitetura. Decorar um número de syscall não ensina o contrato; compreender entrada, validação, serviço e retorno forma um modelo reutilizável.
Da leitura de um arquivo ao retorno
Imagine que uma aplicação queira obter bytes de um arquivo já aberto. Em um ambiente semelhante a POSIX, ela pode chamar uma função de biblioteca como read(). O percurso conceitual tem estas etapas:
- a aplicação informa o descritor, o endereço do buffer e a quantidade desejada;
- uma biblioteca organiza os argumentos segundo a convenção da plataforma;
- uma instrução controlada transfere a execução para o ponto de entrada do kernel;
- o kernel reconhece a operação e verifica argumentos, permissões e estado;
- o subsistema responsável encontra dados disponíveis ou aguarda a entrada necessária;
- a operação produz uma quantidade de bytes ou uma condição de erro;
- o controle retorna ao modo de usuário pela sequência prevista;
- a biblioteca e a aplicação interpretam o resultado.
Validar é parte do serviço, não um detalhe opcional. Um endereço fornecido pela aplicação pode ser inválido; o descritor pode não representar um arquivo aberto para leitura; a quantidade pode exceder limites; o chamador pode não ter acesso ao objeto. A entrada no kernel concede a oportunidade de pedir, não aprovação automática.
O retorno também merece atenção. Uma leitura não precisa entregar tudo o que foi solicitado em uma única chamada. Pode retornar menos bytes, indicar fim de arquivo ou informar que a operação foi interrompida ou não poderia prosseguir naquele momento. Código correto usa o contrato da interface e trata resultados, em vez de presumir sucesso completo.
API, biblioteca e syscall não são a mesma camada
Os termos se aproximam no uso cotidiano, mas representam responsabilidades diferentes.
| Camada | O que representa | Relação possível com o kernel |
|---|---|---|
| API | contrato usado pelo programa: nomes, parâmetros, resultados e comportamento | pode ser oferecida por biblioteca, runtime, serviço ou sistema |
| Função de biblioteca | implementação chamada como uma função comum | pode trabalhar só no usuário, envolver uma ou várias syscalls ou escolher caminhos diferentes |
| Chamada de sistema | ponto de entrada controlado para um serviço do kernel | transfere controle ao núcleo segundo a ABI da plataforma |
Às vezes existe uma correspondência próxima: um wrapper de biblioteca prepara uma chamada e repassa seu resultado. Em outros casos, a função nem precisa entrar no kernel porque resolve o trabalho em memória de usuário. Também pode combinar várias chamadas, reutilizar dados em cache ou selecionar outra operação conforme a versão e a arquitetura.
Por isso, dizer que “toda função da biblioteca é uma syscall” está errado. O inverso também é arriscado: uma syscall pode existir como interface de baixo nível sem ser destinada ao uso direto por toda aplicação. Bibliotecas estabilizam contratos, convertem erros e escondem detalhes da ABI — a interface binária entre componentes.
Que serviços atravessam essa interface
Listas exatas são específicas de cada sistema, mas as operações costumam formar grupos reconhecíveis:
- processos e execução: criar, encerrar, esperar, sinalizar e consultar unidades de execução;
- memória: mapear regiões, alterar proteções e compartilhar áreas controladas;
- arquivos e diretórios: abrir, ler, escrever, consultar metadados e manipular nomes;
- dispositivos e entrada/saída: transferir dados, aguardar eventos e solicitar operações específicas;
- comunicação: criar canais, sockets e mecanismos de troca entre processos;
- tempo e observação: consultar relógios, programar espera e obter informações permitidas;
- identidade e proteção: consultar credenciais ou solicitar alterações autorizadas.
Essas famílias revelam um padrão: a syscall aparece quando a aplicação precisa de um estado administrado pelo kernel ou de uma capacidade que não possui diretamente. Nem toda operação custosa exige uma syscall, e nem toda syscall toca imediatamente o hardware. O kernel pode responder usando metadados ou caches já presentes em memória.
O kernel valida antes de executar
Ao receber a solicitação, o núcleo precisa tratá-la como entrada de uma fronteira de confiança. Entre as verificações possíveis estão:
- o número ou identificador corresponde a uma operação válida;
- os argumentos têm formatos e limites aceitáveis;
- endereços de memória pertencem a regiões acessíveis no contexto correto;
- descritores e objetos ainda existem e aceitam aquela operação;
- identidade, capacidades e permissões permitem o pedido;
- o estado atual torna a ação possível.
Mesmo uma aplicação legítima pode fornecer dados inválidos por erro de programação. Um programa malicioso pode tentar explorar justamente as condições de borda. O kernel, portanto, não deve confiar em um ponteiro apenas porque veio de um processo autenticado. O princípio se conecta ao controle de acesso e menor privilégio: cada participante deve alcançar somente o necessário, e cada pedido precisa ser avaliado no contexto adequado.
Uma validação aprovada também não promete que a operação terminará. Recursos podem se esgotar, um dispositivo pode falhar, um evento pode não chegar ou o estado pode mudar durante o trabalho. Interfaces de sistema definem como representar essas situações para que a aplicação decida entre repetir, aguardar, usar uma alternativa ou encerrar.
Mudança de modo não é troca de contexto
Uma confusão frequente é afirmar que toda syscall provoca troca de processo. Ao entrar no kernel, há uma mudança de modo ou privilégio: a CPU passa a executar código autorizado do núcleo em nome da solicitação. Isso não exige, por si só, que outro processo receba o processador.
Se o serviço termina imediatamente, o kernel pode devolver o controle ao mesmo processo, que continua depois da instrução de chamada. O endereço executado e o privilégio mudaram durante o percurso, mas a identidade da atividade atendida permaneceu.
Uma troca de contexto ocorre quando o sistema salva o estado de uma unidade em execução e restaura o estado de outra. Isso pode acontecer porque a primeira bloqueou aguardando entrada e saída, esgotou sua fatia de tempo, foi preemptada ou deixou de ser a melhor opção segundo a política de escalonamento. A syscall pode criar a condição para a troca, mas não é sinônimo dela.
Essa distinção evita uma conclusão enganosa sobre custo. Entrar e sair do kernel possui trabalho próprio, e trocar contexto adiciona salvamento, restauração e possíveis efeitos em caches e traduções. O custo real depende de arquitetura, implementação, estado e operação; não deve ser reduzido a um número universal.
Função, syscall, interrupção e exceção
Quatro mecanismos podem alterar o fluxo da CPU, mas não têm a mesma origem nem o mesmo propósito.
| Evento | Origem típica | Intenção |
|---|---|---|
| chamada de função | instrução do próprio programa | reutilizar código dentro do contrato da linguagem e da ABI |
| chamada de sistema | solicitação intencional do software | pedir um serviço protegido ao kernel |
| interrupção de hardware | dispositivo ou controlador externo ao fluxo atual | avisar que um evento requer atendimento |
| exceção do processador | execução da instrução atual ou condição síncrona | sinalizar falta de página, divisão inválida, instrução especial ou outra condição definida |
A terminologia muda entre arquiteturas e livros. Uma chamada de sistema pode usar uma instrução descrita tecnicamente como exceção ou trap, enquanto “interrupção” às vezes aparece como termo amplo. Para estudar com precisão, observe duas perguntas: quem originou o evento? e ele é síncrono com a instrução atual?
Uma chamada de função comum continua no mesmo nível de privilégio. Uma interrupção de rede pode chegar sem que a aplicação esteja fazendo uma syscall naquele instante. Uma falta de página pode ocorrer enquanto o processo acessa uma página virtual e levar o kernel a resolver o mapeamento ou encerrar a atividade. Mecanismos diferentes podem convergir para rotinas privilegiadas, mas continuam diferentes em causa e contrato.
Portabilidade exige separar contrato de implementação
POSIX especifica interfaces de sistema para ambientes compatíveis, mas não determina todos os detalhes internos do kernel. Linux expõe um conjunto próprio de syscalls e mantém documentação para a API oferecida ao espaço de usuário. Windows possui seus contratos e subsistemas. Até dentro de uma mesma família, arquitetura de CPU e biblioteca podem alterar como a transição é feita.
Assim, read() é um bom exemplo didático em sistemas POSIX, não uma regra para toda linguagem e plataforma. Aplicações JavaScript, Java ou .NET normalmente usam runtimes e APIs de nível mais alto; várias camadas podem existir antes da operação do sistema. Ainda assim, o modelo permanece útil:
- a aplicação expressa uma intenção por um contrato disponível;
- alguma camada traduz o pedido quando um serviço privilegiado é necessário;
- o kernel valida e coordena o recurso;
- um resultado observável retorna às camadas superiores.
Ferramentas de rastreamento podem mostrar chamadas feitas por um processo em um sistema específico. Elas ajudam a relacionar teoria e prática, mas a saída não representa todo o trabalho de uma função nem prova que cada ação visível veio diretamente do código-fonte da aplicação. Inicialização do runtime, carregamento de bibliotecas e tarefas auxiliares também produzem chamadas.
Erros comuns
- “Kernel é todo o sistema operacional.” O núcleo é central, mas bibliotecas, serviços e ferramentas no espaço de usuário também compõem a plataforma.
- “Espaço de usuário é uma pasta do disco.” O termo descreve domínios de execução, endereçamento e privilégio, não um diretório.
- “Entrar no kernel dá permissão ao programa.” A transição entrega o controle ao kernel, que ainda valida argumentos, identidade, permissões e estado.
- “Toda API chama o kernel uma vez.” Uma API pode operar sem syscall, realizar várias ou escolher caminhos diferentes.
- “Toda syscall acessa hardware.” Muitas são respondidas com estados e dados já administrados em memória.
- “Syscall e troca de contexto são sinônimos.” Uma muda o domínio de privilégio; a outra muda a unidade que executa.
- “Interrupção e chamada de sistema são iguais.” Podem compartilhar mecanismos arquiteturais, porém têm origens e contratos distintos.
- “O retorno sempre significa sucesso completo.” Resultados parciais, espera e erros fazem parte da interface.
O que você deve guardar
O kernel mantém recursos e estados que não podem ser modificados livremente por cada aplicação. O espaço de usuário limita privilégios e ajuda a isolar processos. Quando um programa precisa de um serviço protegido, ele usa uma interface que, direta ou indiretamente, leva a uma chamada de sistema.
O percurso essencial é preparar, entrar, validar, executar e retornar. Bibliotecas e APIs podem esconder detalhes e não correspondem necessariamente a uma única syscall. O kernel avalia cada pedido; estar executando código privilegiado em nome de um processo não torna o pedido automaticamente autorizado.
Por fim, separe mudança de modo de troca de contexto. Uma chamada curta pode entrar no kernel e voltar ao mesmo processo. Se houver bloqueio, preempção ou outro motivo de escalonamento, o sistema pode salvar aquele contexto e executar outro. Continue pela comparação entre kernels monolíticos, microkernels, híbridos e modulares.
Referências
- Linux man-pages — syscall(2). Acesso em 3 set. 2026.
- Linux man-pages — syscalls(2). Acesso em 3 set. 2026.
- Linux man-pages — intro(2). Acesso em 3 set. 2026.
- Linux Kernel Documentation — The Linux kernel user-space API guide. Acesso em 3 set. 2026.
- Linux Kernel Documentation — Adding a New System Call. Acesso em 3 set. 2026.
- Microsoft Learn — User mode and kernel mode. Acesso em 3 set. 2026.
- The Open Group — POSIX.1-2024: General Information. Acesso em 3 set. 2026.
- The Open Group — POSIX.1-2024: System interfaces. Acesso em 3 set. 2026.
- ACM, IEEE-CS e AAAI — CS2023: Operating Systems. Acesso em 3 set. 2026.
