Ошибка при попытке создать новый системный вызов Linux Kernel 4.14.79 - PullRequest
0 голосов
/ 26 января 2019

Я сталкиваюсь с проблемами, пытаясь создать новый системный вызов, имитирующий калькулятор в Linux Kernel версии 4.14.79. Я создаю пользовательскую программу, которая должна использовать этот новый системный вызов. Когда я пытаюсь скомпилировать свою пользовательскую программу, я получаю сообщение об ошибке:

gcc -o test_calc test_calc.c 
test_calc.c: In function 'main': 
test_calc.c:137:30: error: 'SYS_calc' undeclared (first use in this function)
int status = syscall(SYS_calc, param1, param2, operation, &finalTotal);
test_calc.c:102:30: note: each undeclared identifier is reported only once for each function it appears in

Я полагаю, что я делаю ненужные дополнения к Ядру (я дважды выполняю системный вызов), а также что-то пропущено в моей программе для пользователя.

Шаги, которые я предпринял для создания нового системного вызова:

  1. Добавлена ​​запись системного вызова в таблицу в arch/arm/tools/syscall.tbl в виде:

    398     common     calc             sys_calc
    
  2. Добавлена ​​реализация системного вызова для /kernel/sys.c в виде:

    SYSCALL_DEFINE4(calc, int param1, int param2, char operation,  int* result)
    {
    //do my stuff, update result, return -1 or 0. 
    }
    
  3. Добавлено объявление функции к /include/linux/syscalls.h в форме:

    asmlinkage long sys_calc(int param1, int param2, char operation, int* result);
    
  4. В каталоге верхнего уровня Ядра я создаю новый каталог. В этом каталоге я создаю другой каталог. В этом каталоге (/newDirectoryOne/kernelStuff) у меня есть файл sys_calc.c со следующей реализацией:

    #include <linux/kernel.h> 
    
    
    asmlinkage long sys_calc(int param1, int param2, char operation, int* result)
    {
    //Do stuff, update result, return -1 or 0. 
    }
    

В этом каталоге у меня есть файл Kbuild в форме obj-y += sys_calc.o, и я добавил необходимую информацию в Makefile верхнего уровня:

     core‐y+=kernel/ mm/ fs/ ipc/ security/ crypto/ block/ newDirectoryOne/kernelStuff/
  1. Мое приложение пользовательского пространства находится в каталоге /newDirectoryOne/userSpaceStuff, и соответствующие части (мои включения и способ вызова системного вызова) программы пользовательского пространства:

    #include <string.h>
    #define _GNU_SOURCE
    #include <unistd.h>
    #include <sys/syscall.h>
    #include <sys/types.h>
    #include <signal.h>
    
    //SYSTEM CALL USED HERE
    
    int status = syscall(SYS_calc, param1, param2, operation, &finalTotal);
    

Может ли кто-нибудь указать мне правильное направление относительно того, что конкретно необходимо сделать, чтобы совершить новый системный вызов, или сказать, что я делаю неправильно?

...