Chamadas do sistema no linux

2

Geralmente, os sistemas fornecem uma biblioteca ou API que fica entre os programas normais e o sistema operacional. Em sistemas Unix-like, essa API é geralmente parte de uma implementação da biblioteca C (libc), como glibc, que fornece funções de invólucro para as chamadas do sistema. Em C i pode usar essas funções de invólucro para fazer chamadas do sistema. Como faço chamadas do sistema em outros idiomas?

    
por saurav1405 16.07.2014 / 16:15

1 resposta

2

Na maioria das vezes, o idioma de sua escolha fornecerá funções (de algum tipo) que, eventualmente, mapeiam os syscalls relevantes. . Nesses casos, basta usá-los e chamá-lo por dia; não há necessidade de considerar interfaces syscall. Na verdade, eu diria que, a menos que você esteja escrevendo uma biblioteca padrão, não deve haver necessidade de considerar os detalhes de nível inferior em primeiro lugar. Não é como nos dias do IBM PC original, em que o acesso direto às estruturas de memória poderia aumentar drasticamente o desempenho (e, mesmo assim, era reconhecido como uma solução não ótima, porque limitava muito a portabilidade).

Dito isso, você pode executar syscalls diretos em qualquer idioma que permita imitar o esperado convenção de convocação . Na verdade, isso não é realmente diferente de qualquer chamada interbinária, incluindo chamadas de biblioteca (embora, com bibliotecas, isso geralmente seja um problema menor, já que provavelmente elas serão gravadas na mesma convenção de chamada).

A convenção de chamada dita coisas como como parâmetros e valores de retorno são passados para e de uma função chamada e forma uma parte da ABI (Interface Binária do Aplicativo) de uma plataforma. Note que neste caso, "plataforma" é um termo bastante amplo, abrangendo potencialmente tanto o sistema operacional, ambiente de tempo de execução, linguagem, compilador e configurações (incluindo declarações de nível de código-fonte).

Então, o que você precisa fazer é fazer com que seu outro idioma faça uma chamada de função que esteja em conformidade com a convenção de chamada usada e, em seguida, simplesmente chame a interface apropriada. Se você estiver usando o assembler, isso é trivial, já que você provavelmente já está fazendo todos os parâmetros e resultados passando por você mesmo; Se você estiver usando algo do outro extremo da escala, como BASIC ou Perl, terá muita dificuldade em se adequar a uma convenção de chamada estrangeira porque as linguagens praticamente não possuem o conceito.

Exatamente como você escreveria o código para usar uma convenção de chamada alternativa (ou específica) depende muito da linguagem (e provável compilador) em questão, e é muito ampla para responder em geral. E, claro, você precisa saber qual convenção de chamada deve estar em conformidade.

    
por 16.07.2014 / 16:29