我在尝试创建一个新的系统调用来模仿Linux内核版本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.
}
在此目录中,我有一个obj-y += sys_calc.o
格式的Kbuild文件,并将必要的信息添加到了顶层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);
任何人都可以向我指出正确的方向,以进行新的系统调用时具体需要执行什么操作,或者告诉我我做错了什么?