尝试创建新的系统调用Linux内核4.14.79时出错

时间:2019-01-26 01:13:41

标签: linux kernel system-calls

我在尝试创建一个新的系统调用来模仿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

我相信我对内核进行了不必要的添加(我两次实现了系统调用),并且在我的用户空间程序中缺少了一些东西。

创建新系统调用所采取的步骤:

  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. 
    }
    

在此目录中,我有一个obj-y += sys_calc.o格式的Kbuild文件,并将必要的信息添加到了顶层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);
    

任何人都可以向我指出正确的方向,以进行新的系统调用时具体需要执行什么操作,或者告诉我我做错了什么?

0 个答案:

没有答案