在Linux 5.7中实现系统调用时出错

4

这是我所做的。

在路径./linux-5.7下

创建文件夹hello

进入hello文件夹

使用vim编辑器打开hello.c文件

#include <linux/kernel.h>

asmlinkage long sys_hello(void) {
    printk ("\n\nHello Kernel\n\n");

    return 0;
}

vim Makefile

obj-y := hello.o

vim arch/x86/entry/syscalls/syscall_64.tbl

439 common  hello           sys_hello

vim include/linux/syscalls.h

asmlinkage long sys_hello(void);

编译内核

make -j4

出错了...

ld: arch/x86/entry/syscall_64.o:(.rodata+0xdb8): undefined reference to `__x64_sys_hello'
make: *** [Makefile:1113: vmlinux] Error 1

这里有什么问题...
...
...

1
这个回答解决了你的问题吗?在x86 ubuntu linux上无法添加自定义系统调用 - Joseph Sible-Reinstate Monica
首先,定义系统调用的语法已经更改为:SYSCALL_DEFINEn(...)。请查看此文档:链接 - losnihciL
1个回答

2

我遇到了类似的问题,但是Joseph的评论中提供的解决方案对我没有用。因此,这个答案是为那些尝试了Joseph的方法但没有取得进展的人准备的。

以下是我根据内核文档采取的步骤:

在入口点前面加上__x64_后,如果出现错误,例如:

ld: arch/x86/entry/syscall_64.o:(.rodata+0xdc8): undefined reference to `__x64___x64_sys_my_syscall'
ld: arch/x86/entry/syscall_x32.o:(.rodata+0xdc8): undefined reference to `__x64___x64_sys_my_syscall'
make: *** [Makefile:1179: vmlinux] Error 1

如果您不想在系统调用的入口点前加上__x64_,那么可以将系统调用放入arch/x86/entry/syscalls/syscall_64.tblarch/x86/entry/syscalls/syscall_32.tbl中,而无需添加任何前缀。

- At the `arch/x86/entry/syscalls/syscall_64.tbl`,
441 common  my_syscall  sys_my_syscall
- At the arch/x86/entry/syscalls/syscall_32.tbl`
441 i386 my_syscall sys_my_syscall

如果您仍然遇到同样的问题,则将您的系统调用添加到通用系统调用表中:该表在几个架构之间共享。

请将以下内容放入include/uapi/asm-generic/unistd.h中:

#define __NR_my_syscall 441
__SYSCALL(__NR_my_syscall, sys_my_syscall)

请注意,我使用的内核版本是WSL2-Linux-Kernel-linux-msft-wsl-5.10.60.1,它是以x64架构构建的。
由于我在操作系统和Linux内核方面还是很新手,所以这只是对我有效的方法,我不知道其确切的机制;抱歉没有解释机制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接