Chamadas de sistema

O que é uma chamada de sistema Linux?

O que é uma chamada de sistema Linux?

Primeiras coisas primeiro

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

O kernel do Linux é um programa especializado que inicializa e roda no nível mais baixo disponível em seu hardware. Ele tem a tarefa de orquestrar tudo o que é executado no computador, incluindo manipulação de teclado, disco e eventos de rede para fornecer fatias de tempo para a execução de 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 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 confiabilidade. Um aplicativo sem privilégios não pode acessar a memória pertencente a outros programas, e se esse programa travar, o kernel é encerrado para que não possa prejudicar o resto do sistema.

Ultrapassando a barreira com chamadas de sistema Linux

Esta camada de isolamento entre aplicativos sem privilégios fornece um limite excelente para proteger outros aplicativos e usuários no sistema. No entanto, sem alguma forma de interface com os outros elementos do computador e do mundo exterior, os programas não seriam capazes de realizar muita coisa.

Para facilitar a interação, o kernel designa uma porta de software que permite ao programa em execução solicitar que o kernel aja em seu nome. Esta interface é conhecida como chamada de sistema.

Como o Linux segue a filosofia UNIX de “tudo é um arquivo”, muitas funções podem ser executadas abrindo e lendo ou gravando em um arquivo, 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 os bytes dele usando chamadas de sistema de entrada / saída de arquivo padrão. Esta diferença crucial permite uma interface de chamada de sistema mais simples.

Wrapper Wafer-Thin

Na maioria dos aplicativos, as chamadas do sistema não são feitas diretamente para o kernel. Praticamente todos os programas estão vinculados à biblioteca C padrão, que fornece um invólucro fino, mas importante, em torno das chamadas do sistema Linux. A biblioteca certifica-se de que os argumentos da função são copiados para os registros corretos do processador, em seguida, emite a chamada de sistema Linux correspondente. Quando os dados são recebidos da chamada, o wrapper interpreta os resultados e os retorna para o programa de maneira consistente.

Por trás das cenas

Cada função em um programa que interage com o sistema é eventualmente traduzida em uma chamada de 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ê verá. Ele simplesmente ganha controle por meio do ponto de entrada principal e, em seguida, sai. Ele nem mesmo retorna um valor, pois main é definido como void. Salve o arquivo como ctest.ce vamos compilá-lo:

gcc ctest.c -o ctest

Depois de compilado, podemos ver o tamanho do arquivo como 8.664 bytes. Pode variar um pouco no seu sistema, mas deve ser em torno de 8k. É muito código apenas para entrar e sair! A razão de ser 8k é que o tempo de execução libc está sendo incluído. Mesmo se retirarmos os símbolos, ainda é um pouco mais de 6k.

Em um exemplo ainda mais simples, podemos fazer a chamada do sistema Linux 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, limpamos o registro EBX (que de outra forma conteria o valor de retorno) e chamamos a interrupção de chamada do sistema Linux 0x80 (ou 128 em decimal). Esta interrupção aciona o kernel para processar nossa chamada.

Se compilarmos nosso novo exemplo, chamado asmtest.c, e remover os símbolos e excluir a biblioteca padrão:

gcc -s -nostdlib asmtest.c-o asmtest

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

Para todos os fins práticos

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

Como programar tutoriais de chamada do sistema

Lista de todas as chamadas do sistema

Se quiser ver uma lista de todas as chamadas de sistema disponíveis para Linux, você pode verificar estas páginas de referência: Lista completa de chamadas de sistema no LinuxHint.com, filippo.io / linux-syscall-table / e ou syscalls.kernelgrok.com

Adicione gestos do mouse ao Windows 10 usando essas ferramentas gratuitas
Nos últimos anos, os computadores e sistemas operacionais evoluíram muito. Houve um tempo em que os usuários tinham que usar comandos para navegar pel...
Controle e gerencie o movimento do mouse entre vários monitores no Windows 10
Gerenciador de mouse com tela dupla permite que você controle e configure o movimento do mouse entre vários monitores, diminuindo seus movimentos pert...
WinMouse permite que você personalize e melhore o movimento do ponteiro do mouse no PC com Windows
Se você quiser melhorar as funções padrão do ponteiro do mouse, use um freeware WinMouse. Ele adiciona mais recursos para ajudá-lo a obter o máximo do...