Como adicionar uma chamada de sistema no kernel linux 4.x

2

Eu estou tentando adicionar uma chamada de sistema usando o linux kernel 4.1.6, mas toda a documentação que eu posso encontrar é para versões mais antigas. Alguém sabe como é feito nos novos kernels ou tem boas referências?

Deve haver três etapas:

  1. Adicione à tabela de chamadas do sistema. Eu percebi que agora eles usam arch / x86 / syscalls / syscall_64.tbl em vez de entry.S. Então coloquei algo lá.

  2. Adicione ao arquivo asm / unistd.h. Aparentemente, o arquivo unistd.h é gerado automaticamente agora, então não precisamos atualizá-lo manualmente? Então, não fiz nada para essa etapa, pois o arquivo não existe. link

  3. Compile o syscall no kernel. Eu adicionei o código de chamada do sistema real ao kernel / sys.c como sugerido em um livro baseado no kernel 2.6 (O livro de desenvolvimento de kernel do Linux por Robert Love). Eu compilei o kernel novamente.

Eu, então, escrevi um programa cliente como sugerido no livro, mas ele diz o nome do tipo desconhecido 'helloworld' quando tento compilá-lo. Meu programa é diferente do livro, mas a estrutura é a mesma.

#include <stdio.h>

#define __NR_helloworld 323 
__syscall0(long, helloworld)

int main()
{
    printf("I will now call helloworld syscall:\n");
    helloworld();

    return 0;
}

A Internet (e os livros disponíveis) parecem estar seriamente carentes desta informação - ou o Google não é tão inteligente quanto gostaria de pensar. De qualquer forma, qualquer ajuda é apreciada.

Obrigado. ~
~
~

    
por Michael Vescovo 18.08.2015 / 10:14

2 respostas

4

De acordo com a página man _syscall (2) , a macro _syscall0 pode ser obsoleto e requer #include <linux/unistd.h> ; de fato, o Linux 4.x não tem isso

No entanto, você pode instalar musl-libc e usar sua função _syscall .

E você pode simplesmente usar o syscall (2) indireto no seu código de usuário . Então o seu programa de testes seria

#define _GNU_SOURCE         /* See feature_test_macros(7) */
#include <unistd.h>
#include <sys/syscall.h> 
#include <stdio.h>
#define __NR_helloworld 323
static inline long mysys_helloworld(void) { return syscall(__NR_helloworld,NULL); }

int main (int argc, char**argv) {  
   printf("will do the helloworld syscall\n");
   if (mysys_helloworld()) perror("helloworld");
   return 0;
}

O código acima não foi testado!

    
por 18.08.2015 / 10:29
0

Bem, supondo que o instrutor queira que as pessoas leiam a fonte e não apenas recortem e colem da internet, é indiscutivelmente uma tarefa bem planejada. (Dito isto, o código do kernel do linux não é muito bom de ler. Certifique-se de saber como usar o etags, porque muitas vezes é necessário rastrear macros com três níveis de profundidade para ver o que está acontecendo.)

    
por 18.08.2015 / 10:29