Chamada de sistema
Origem: Wikipédia, a enciclopédia livre.
Na computação, uma chamada de sistema (system call) é o mecanismo usado pelo programa para requisitar um serviço do sistema operacional, ou mais especificamente, do kernel do sistema operacional.
Índice |
[editar] 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 kernel 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.
[editar] 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 maior 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 I/O 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.
[editar] 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 kernel. 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 kernel e com o chamamento da rotina previligiada propriamente dita, nomeadamente a conversão de convenções de chamamento. 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 exokernel, a biblioteca é especialmente importante como um intermediário. As LibOSes dos exokernels blindam as aplicações do usuário das APIs do kernel de baixo nível, oferecem abstrações e gerenciamento de recursos.
[editar] Exemplos
Nos sistemas POSIX e similares, as chamadas de sistema mais usadas são close, execve, fork, wait, kill, open, read, write 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).
[editar] Ligações externas
- Linux system calls - Chamadas de sistema para o kernel 2.2 do Linux, com convenções de chamada IA32, em inglês
- How System Calls Work on Linux/i86, em inglês