【问题标题】:Error implementing system call in Linux 5.7在 Linux 5.7 中实现系统调用时出错
【发布时间】:2020-09-21 05:37:03
【问题描述】:

这就是我所做的。

在路径 ./linux-5.7

mkdir 你好

你好

vim hello.c

#include <linux/kernel.h>

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

    return 0;
}

vim 生成文件

obj-y := hello.o

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

439 common  hello           sys_hello

vim 包含/linux/syscalls.h

asmlinkage long sys_hello(void);

...

...

编译内核

制作-j4

错误...

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

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

...

...

【问题讨论】:

标签: linux system-calls


【解决方案1】:

我遇到了类似的问题,但约瑟夫评论中的解决方案对我来说并不奏效。所以,这个答案适用于那些尝试过 Joseph 的方法但没有取得进展的人。

这是我基于Kernel document采取的步骤

在入口点前面加上__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 内核方面相当新手,所以这对我有用,我不知道它的确切机制;对不起,没有机制解释。

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 2016-05-25
    • 2015-05-24
    • 2012-09-19
    • 1970-01-01
    • 2018-08-23
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多