Я сталкиваюсь с проблемами, пытаясь создать новый системный вызов, имитирующий калькулятор в 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
Я полагаю, что я делаю ненужные дополнения к Ядру (я дважды выполняю системный вызов), а также что-то пропущено в моей программе для пользователя.
Шаги, которые я предпринял для создания нового системного вызова:
Добавлена запись системного вызова в таблицу в arch/arm/tools/syscall.tbl
в виде:
398 common calc sys_calc
Добавлена реализация системного вызова для /kernel/sys.c
в виде:
SYSCALL_DEFINE4(calc, int param1, int param2, char operation, int* result)
{
//do my stuff, update result, return -1 or 0.
}
Добавлено объявление функции к /include/linux/syscalls.h
в форме:
asmlinkage long sys_calc(int param1, int param2, char operation, int* result);
В каталоге верхнего уровня Ядра я создаю новый каталог. В этом каталоге я создаю другой каталог. В этом каталоге (/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/
Мое приложение пользовательского пространства находится в каталоге /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);
Может ли кто-нибудь указать мне правильное направление относительно того, что конкретно необходимо сделать, чтобы совершить новый системный вызов, или сказать, что я делаю неправильно?