获得错误38:功能未实施'在进行系统调用时

时间:2014-05-07 11:40:24

标签: linux-kernel system-calls intel

我正在尝试在Linux中编写系统调用。我分别修改了unistd.hsyscall_32.tblsys.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)

223 i386 zslhello sys_zslhello

asmlinkage int sys_zslhello(int ret)
{
    printk("Hello, my syscall!\n");
    return ret;
}

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

1 个答案:

答案 0 :(得分:3)

这是因为顾名思义没有实现syscall。可能在你的情况下你的机器是64位的。因此,您必须更改文件syscall_64.tbl而不是syscall_32.tbl

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

x common zslhello sys_zslhello

x为1加上公共区域的最后一个值。这就是我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

在我的情况下x是332.干杯!