O que é uma chamada do sistema Linux?

O que é uma chamada do sistema Linux?

Primeiras coisas primeiro

Antes de nos aprofundarmos na definição de uma chamada do sistema Linux e examinar os detalhes de sua execução, é melhor começar com a definição das várias camadas de software de um sistema Linux típico.

O Linux Kernel é um programa especializado que inicializa e funciona no nível mais baixo disponível em seu hardware. Ele tem a tarefa de orquestrar tudo o que é executado no computador, incluindo manuseio de teclado, disco e eventos de rede para fornecer fatias de tempo para executar vários programas em paralelo.

Quando o kernel executa um programa em nível de usuário, ele virtualiza o espaço de memória para que os programas acreditem que eles são o único processo em execução na memória. Esta bolha protetora de isolamento de hardware e software aumenta a segurança e a confiabilidade. Um aplicativo não privilegiado não pode acessar a memória pertencente a outros programas e, se esse programa travar, o kernel termina para que não possa prejudicar o restante do sistema.

Calcular a barreira com chamadas do sistema Linux

Essa camada de isolamento entre aplicativos não privilegiados fornece um excelente limite para proteger outros aplicativos e usuários no sistema. No entanto, sem alguma maneira de interagir com os outros elementos do computador e do mundo exterior, os programas não seriam capazes de realizar muito de nada.

Para facilitar a interação, o kernel designa um portão de software que permite ao programa em execução solicitar que a Lei do Kernel em seu nome. Esta interface é conhecida como chamada de sistema.

Como o Linux segue a filosofia do UNIX de "Tudo é um arquivo", muitas funções podem ser desempenhadas abrindo e lendo ou escrevendo em um arquivo, o que pode ser um dispositivo. No Windows, por exemplo, você pode usar uma função chamada CryptGenRandom para acessar bytes aleatórios. Mas no Linux, isso pode ser feito simplesmente abrindo o "arquivo"/dev/urandom e lendo bytes dele usando chamadas de sistema de entrada/saída de arquivo padrão. Essa diferença crucial permite uma interface de chamada de sistema mais simples.

Invólucro fino de wafer

Na maioria das aplicações, as chamadas do sistema não são feitas diretamente para o kernel. Praticamente todos os programas vinculam na biblioteca C padrão, que fornece um invólucro fino, mas importante, em torno do sistema Linux Calls. A biblioteca garante que os argumentos da função sejam copiados para os registros de processador corretos, emitem a chamada do sistema Linux correspondente. Quando os dados são recebidos da chamada, o invólucro interpreta os resultados e o devolve ao programa de uma maneira consistente.

Por trás das cenas

Todas as funções em um programa que interage com o sistema é eventualmente traduzido em uma chamada do sistema. Para ver isso em ação, vamos começar com um exemplo básico.

void main ()

Este é provavelmente o programa C mais trivial que você já viu. Simplesmente ganha controle através do ponto de entrada principal e depois sai. Ele nem retorna um valor, já que o principal é definido como vazio. Salve o arquivo como CTest.c e vamos compilar:

GCC CTEST.C -o ctest

Uma vez compilado, podemos ver o tamanho do arquivo como 8664 bytes. Pode variar um pouco no seu sistema, mas deve ser cerca de 8k. Isso é muito código apenas para entrar e sair! A razão pela qual é 8k é que o tempo de execução da libc está sendo incluído. Mesmo se tirarmos os símbolos, ainda é um pouco mais de 6k.

Em um exemplo ainda mais simples, podemos fazer o sistema Linux ligar para sair, em vez de depender do tempo de execução C para fazer isso por nós.

void _start ()
ASM ("MOVL $ 1,%EAX;"
"Xorl %eBX, %EBX;"
"int $ 0x80");

Aqui, movemos 1 para o registro EAX, limpe o registro EBX (que de outra forma conteria o valor de retorno) e depois chamaria a chamada de chamada do sistema Linux 0x80 (ou 128 em decimal). Esta interrupção desencadeia o kernel para processar nossa chamada.

Se compilarmos nosso novo exemplo, chamado ASMTest.C, e retire os símbolos e exclua a biblioteca padrão:

gcc -s -nostdlib Asmtest.C -O ASMTEST

produziremos um binário menos de 1k (no meu sistema, ele produz 984 bytes). A maior parte desse código são cabeçalhos executáveis. Agora estamos chamando a chamada do sistema Linux direto.

Para todos os fins práticos

Em quase todos os casos, você nunca precisará fazer chamadas diretas do sistema em seus programas C. Se você usar a linguagem de montagem, no entanto, a necessidade pode surgir. No entanto, na otimização, seria melhor permitir que as funções da biblioteca C façam as chamadas do sistema e tenham apenas seu código crítico de desempenho incorporado nas diretivas de montagem.

Como programar o sistema de chamadas de tutoriais

  • Chamada do sistema EXEC
  • Chamada do sistema de garfo
  • Chamada do sistema STAT

Lista de todas as chamadas do sistema

Se você deseja ver uma lista de todas as chamadas do sistema disponível para Linux, você pode verificar estas páginas de referência: Lista completa de chamadas do sistema no Linuxhint.com, Filippo.IO/ Linux-SysCall-Table/ e Syscalls.Kernelgrok.com