# Chamada de sistema

Em computação, uma chamada de sistema (system call) é o mecanismo programático pelo qual um programa de computador solicita um serviço do núcleo do sistema operacional sobre o qual ele está sendo executado. Isto pode incluir serviços relacionados ao hardware (por exemplo, acessar uma unidade de disco rígido), criação e execução de novos processos e comunicação com serviços do núcleo de maneira integral como escalonamento do processador. Chamadas do sistema fornecem uma interface essencial entre um processo e o sistema operacional.
Na maioria dos sistemas, as chamadas de sistema são possíveis de serem feitas apenas a partir de processos do espaço do usuário, enquanto em alguns sistemas, OS/360 e sucessores por exemplo, código de sistema privilegiado também emite chamadas de sistema.

## Histórico

Os processadores modernos podem executar instruções com diferentes privilégios. Em sistemas com dois níveis de privilégio, eles são chamados de modo usuário e modo protegido. Os sistemas operacionais disponibilizam diferentes níveis de privilégio que restringem as operações executadas pelos programas, por razões de segurança e estabilidade. Dentre estas operações podem ser incluídas o acesso a dispositivos de hardware, habilitar e desabilitar interrupções ou alterar o modo de privilégio do processador. O núcleo deve ser executado no modo protegido e as aplicações em modo usuário.
Com o desenvolvimento de modos de operação separados, com níveis variados de privilégio, era necessário a criação de um mecanismo para transferir seguramente o controle de modos de menor privilégio para modos de maior privilégio. O código com menor privilégio não pode simplesmente transferir o controle para código com maior privilégio em qualquer ponto do código e em qualquer estado do processador; permitir essa transferência seria permitir a quebra da segurança do sistema. Por exemplo, o código com menor privilégio poderia levar o código com maior privilégio a ser executado na ordem incorreta, ou disponibilizar a ele uma pilha errada.

## Mecanismo

As chamadas de sistema frequentemente utilizam uma instrução especial que faz com que a CPU transfira o controle para código de maior privilégio, como especificado previamente, pelo código de menor privilégio. Isto permite que o código de maior privilégio indique por onde ele será chamado e, tão importante quanto, o estado do processador no momento da chamada.
Quando a chamada de sistema é invocada, o programa que a invocou é interrompido, e a informação necessária para continuar a sua execução é salva. O processador inicia a execução do código de maior privilégio que, examinando o estado do processador (definido pelo código de menor privilégio) e/ou a sua pilha, determina que serviço foi requisitado. Quando a chamada termina, o controle retorna para o programa, o estado previamente salvo é restaurado, e o programa continua a sua execução.
Note que em muitos casos, o retorno de fato para o programa não é imediato. Se a chamada de sistema realiza qualquer tipo de operação de entrada/saída mais demorada, um acesso ao disco ou rede, o programa pode ser suspenso ("bloqueado") e retirado da fila de programas "prontos para execução" até que a operação termine, e o sistema operacional o eleja novamente como um candidato para execução.

## A biblioteca como um intermediário

Os sistemas operacionais geralmente possuem uma biblioteca que os programas normais chamam com o fim de comunicar com o núcleo. Normalmente esta biblioteca é escrita na linguagem C (libc), como a glibc e MS LibC. Esta biblioteca manipula os detalhes de baixo nível relacionados com a passagem de informação para o núcleo e com a chamada da rotina privilegiada propriamente dita, nomeadamente a conversão de convenções de chamadas. Idealmente, isto reduz a dependência entre o sistema operacional e a aplicação, e aumenta a "portabilidade", pois a ABI pode sofrer alterações significativas sem quebrar a compatibilidade.
Em sistemas baseados em exonúcleo, a biblioteca é especialmente importante como um intermediário. As LibOSes dos exonúcleo blindam as aplicações do usuário das APIs do núcleo de baixo nível, oferecem abstrações e gerenciamento de recursos.
Os sistemas operacionais definem chamadas de sistema para todas as operações envolvendo o acesso a recursos de baixo nível (periféricos, arquivos, alocação de memória, etc) ou abstrações lógicas (criação e finalização de tarefas, por exemplo).
Geralmente as chamadas de sistema são oferecidas para as aplicações em modo usuário através de uma biblioteca do sistema (system library), que prepara os parâmetros, invoca a interrupção de software e retorna à aplicação os resultados obtidos.

## Exemplos

Nos sistemas POSIX e similares, as chamadas de sistema mais usadas são close, execve, fork, wait, kill, open, read, write, clone, nice, exit, send, receive, signal e ioctl. Os sistemas operacionais atuais tem centenas de chamadas de sistema. Por exemplo, o Linux tem quase 300 chamadas de sistema diferentes. O FreeBSD tem praticamente o mesmo número (quase 330).
* Portal das tecnologias de informação

## Categorias de chamadas de sistema

As chamadas de sistema podem ser agrupadas, grosso modo, em seis categorias principais:
* Controle de processos
** encerrar, abortar
** carregar, executar
** criar processo, encerrar processo
** obter/definir atributos do processo
** esperar hora, esperar evento, sinalizar evento
** alocar e liberar memória
* Gerenciamento de arquivos
** criar arquivo, excluir arquivo
** abrir, fechar
** ler, gravar, reposicionar
** obter/definir atributos do arquivo
* Gerenciamento de dispositivos
** solicitar dispositivo, liberar dispositivo
** ler, gravar, reposicionar
** obter/definir atributos do dispositivo
** conectar ou desconectar dispositivos logicamente
* Manutenção de informações
** obter/definir a hora ou a data
** obter/definir dados do sistema
** obter/definir atributos do processo, arquivo ou dispositivo
* Comunicações
** criar, excluir conexão de comunicações
** enviar, receber mensagens
** transferir informações de status
** conectar ou desconectar dispositivos remotos
* Proteção
** obter/definir permissões de arquivos