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)
成功了。
| 归档时间: |
|
| 查看次数: |
3171 次 |
| 最近记录: |