Chamada de sistema
Em computação, uma chamada de sistema é 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, 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.
Imagem: jonycunha · BY-SA · Openverse
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.
Imagem: Everson Cavalcante · BY-NC-SA · Openverse
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.
Imagem: de Paula FJ · BY-NC-SA · Openverse
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).
Imagem: de Paula FJ · BY-NC-SA · Openverse
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).
Imagem: de Paula FJ · BY-NC-SA · Openverse
As chamadas de sistema podem ser agrupadas, grosso modo, em seis categorias principais:


