我正在尝试在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)
223 i386 zslhello sys_zslhello
asmlinkage int sys_zslhello(int ret)
{
printk("Hello, my syscall!\n");
return ret;
}
编译内核后,我使用syscall(223, 10000);
,返回值为-1
,errno
为38
,即函数未实现。你有什么想法吗?
答案 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.干杯!