进行系统调用时,获取'errno 38:功能未实现'

zij*_*eng 6 intel system-calls linux-kernel

我正在尝试在Linux中编写系统调用.我修改了unistd.h,syscall_32.tbl并且sys.c分别如下:

/*
#define __NR3264_fadvise64 223
__SC_COMP(__NR3264_fadvise64, sys_fadvise64_64, compat_sys_fadvise64_64)
*/
#define __NR_zslhello 223
__SYSCALL(__NR_zslhello, sys_zslhello)
Run Code Online (Sandbox Code Playgroud)
223 i386 zslhello sys_zslhello
Run Code Online (Sandbox Code Playgroud)
asmlinkage int sys_zslhello(int ret)
{
    printk("Hello, my syscall!\n");
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

在编译内核之后,我使用syscall(223, 10000);,返回值为-1,而errnois 38,即函数未实现.你有什么想法吗?

Ila*_*a S 3

这是因为它syscall没有像名字所暗示的那样实现。就您的情况而言,您的机器可能是 64 位的。所以你必须改变文件syscall_64.tbl而不是syscall_32.tbl.

在定义公共系统调用的文件的最后一行添加一行

x common zslhello sys_zslhello
Run Code Online (Sandbox Code Playgroud)

其中x1 加上公共区域中的最后一个值。这就是我的一个片段的样子syscall_64.tbl

330 common  pkey_alloc      sys_pkey_alloc
331 common  pkey_free       sys_pkey_free

#
# x32-specific system call numbers start at 512 to avoid cache impact
# for native 64-bit operation.
#
512 x32 rt_sigaction        compat_sys_rt_sigaction
513 x32 rt_sigreturn        sys32_x32_rt_sigreturn
Run Code Online (Sandbox Code Playgroud)

就我而言,x是 332。干杯!