错误:尝试进行简单的系统调用时出现类型冲突

Fay*_*ost 1 linux system-calls linux-kernel

我是 Linux 编程的新手,我正在尝试按照本指南松散地实现一个简单的系统调用:https://medium.com/anubhav-shrimal/adding-a-hello-world-system-call-to- linux-kernel-dad32875872。在我的 Linux 内核目录中,我创建了一个名为 的新目录my_syscall。在该目录中,我创建了my_syscall.c. 这是my_syscall.c

#include <linux/syscalls.h>
#include <linux/kernel.h>

asmlinkage long sys_my_syscall(int i) {
   prink(KERN_INFO "This is the system call.");
   return(0);
}
Run Code Online (Sandbox Code Playgroud)

然后我用一行Makefile在目录中创建了一个:my_syscall

obj-y := my_syscall.o
Run Code Online (Sandbox Code Playgroud)

Makefile然后我在内核目录中将此行编辑为:

core-y         += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/ my_syscall/
Run Code Online (Sandbox Code Playgroud)

然后,在目录中linux-5.4.15/arch/x86/entry/syscalls,我编辑了syscall_64.tbl在最后包含以下行:

548     64         my_syscall          sys_my_syscall
Run Code Online (Sandbox Code Playgroud)

最后,在目录中linux-5.4.15/include/linux,我编辑了syscalls.h文件以在以下内容之前包含此行#endif

asmlinkage long sys_my_syscall(int i);
Run Code Online (Sandbox Code Playgroud)

现在,当我运行命令时sudo make,很快就遇到以下错误:

./arch/x86/include/generated/asm/syscalls_64.h:2664:19: error: conflicting types for 'sys_my_syscall'
__SYSCALL_64(548, sys_my_syscall, )

arch/x86/entry/syscall_64.c:18:60: note: in definition of macro '__SYSCALL-64'
  #define __SYSCALL_64(nr, sym, qual) extern asmlinkage long sym(const struct pt_regs *);

In file included from arch/x86/entry/syscall_64.c:7:0:
./include/linux/syscalls.h:1423:17: note: previous declaration of 'sys_my_syscall' was here
 asmlinkage long sys_my_syscall(int i);
                 ^
make[3]: *** [arch/x86/entry/syscall_64.o] Error 1
make[2]: *** [arch/x86/entry] Error 2
make[1]: *** [arch/x86] Error 2
make: *** [sub-make] Error 2
Run Code Online (Sandbox Code Playgroud)

我不知道如何处理这个错误。由于类型冲突错误,我认为我在某个地方以不同的方式声明了系统调用,但在两个my_syscall.c文件中syscalls.h,声明是相同的。这是声明系统调用的唯一两个文件,但它也在其中命名syscall_64.tbl,看起来这就是 linux 试图向我指出的地方。但是,我没有看到我在表中声明它的方式有什么问题,因为我直接按照指南进行操作。任何对此的帮助将不胜感激!

信息:

内核版本:5.4.15

Linux 发行版:Ubuntu 14

小智 6

我刚刚更改了syscall_64.tbl中定义系统调用号的位置。

而不是这个:

548     64         my_syscall          sys_my_syscall
Run Code Online (Sandbox Code Playgroud)

我写了这个:

436     common     my_syscall          __x64_sys_my_syscall
Run Code Online (Sandbox Code Playgroud)

我的配置的屏幕截图

成功了。