无法在x86 ubuntu linux上添加自定义系统调用

时间:2019-02-23 10:48:51

标签: linux operating-system kernel system-calls

我对此并不陌生,只是了解内核,因此我试图向内核4.20.4添加自定义调用。这是我所做的步骤。

  1. 首先,我创建包含代码的文件(kernel/printmsg.c)。
#include <linux/kernel.h>
#include <linux/syscalls.h>

SYSCALL_DEFINE1(printmsg, int, i)
{
    printk(KERN_DEBUG, "TESTING %d", i);
    return 1;
}
  1. 接下来,我将此文件添加到kernel/Makefile
obj-y = fork.o exec_domain.o panic.o \
        // A few more lines
obj-y += printmsg.o // I added this line
  1. 最后,我通过添加以下行,将系统调用添加到arch/x86/entry/syscalls/syscall_64.tbl上的syscall表中(我正在64位Ubuntu上构建它):

548 64 printmsg sys_printmsg

现在,我继续运行make。但是,它有此错误:

arch/x86/entry/syscall_64.o:(.rodata+0x1120): undefined reference to `sys_printmsg'
Makefile:1034: recipe for target 'vmlinux' failed
make: *** [vmlinux] Error 1

为此,我已经挠了很长时间,但我似乎不知道出了什么问题。

希望任何设法找到问题的人都能帮助穷人。预先感谢!

1 个答案:

答案 0 :(得分:0)

好吧,经过数小时的反复试验,我终于找到了问题所在。从Linux内核v4.17开始,x86_64系统调用可能以“ __x64_sys”开头。

因此,我没有使用548 64 printmsg sys_printmsg,而是将其更改为548 64 printmsg __x64_sys_printmsg。然后一切正常。

希望这对可能遇到此问题的所有人有所帮助。