Chamada de sistema de baixo nível [fechada]

3

C fornece funções de biblioteca como write (), read () .. para chamadas de sistema.Como fazer uma chamada de sistema sem usar qualquer biblioteca no linux em C?

    
por saurav1405 16.07.2014 / 17:14

2 respostas

5

A ambição ou um desejo excessivamente severo de pureza podem levar você a fazer uma montagem em linha. Por exemplo, em sistemas x86_64, você pode fazer uma chamada open(2) do sistema assim:

#include <sys/syscall.h>
int
linux_open(const char *pathname, unsigned long flags, unsigned long mode)
{
    long ret;
    asm volatile ("syscall" : "=a" (ret) : "a" (__NR_open),
              "D" (pathname), "S" (flags), "d" (mode) :
              "cc", "memory", "rcx",
              "r8", "r9", "r10", "r11" );
    if (ret < 0)
    {
        errno = -ret;
        ret = -1;
    }
    return (int) ret;
}

Você pode olhar para a fonte de libc mais compreensível (como Musl ) para descobrir como as chamadas do sistema também são implementadas .

    
por 16.07.2014 / 17:50
3

Para fazer chamadas de sistema, você normalmente tem que executar algumas funções na CPU que não fazem parte da especificação da linguagem C. As chamadas do sistema são escritas em conjunto para a CPU e vinculadas, ou é usada alguma montagem inline específica da CPU dentro de uma função C.

Dentro do kernel do Linux, existem várias macros definidas para suportar isso, porque todas as chamadas do sistema exigem uma configuração muito semelhante. O resultado é que muitas vezes não está claro onde o montador específico da CPU está realmente vindo, mas se você cavar fundo o suficiente, você vai chegar lá.

    
por 16.07.2014 / 17:51