Operating system 错误syscall:函数未实现

Operating system 错误syscall:函数未实现,operating-system,linux-kernel,kernel,Operating System,Linux Kernel,Kernel,我正在尝试向linux内核添加新的(虚拟)系统调用 1) 我在linux source/kernel/myfile.c下添加了系统调用代码,并相应地更新了Makefile 2) 更新了syscall.h、unistd.h和entry.S文件,以反映新的系统调用(EducationicTime(int标志,struct timeval*time)) 然后编译内核,安装并重新启动映像 当我运行:cat/proc/kallsyms | grep“pedag”时,这就是我得到的输出 0000000000

我正在尝试向linux内核添加新的(虚拟)系统调用

1) 我在linux source/kernel/myfile.c下添加了系统调用代码,并相应地更新了Makefile

2) 更新了syscall.h、unistd.h和entry.S文件,以反映新的系统调用(EducationicTime(int标志,struct timeval*time))

然后编译内核,安装并重新启动映像

当我运行:
cat/proc/kallsyms | grep“pedag”
时,这就是我得到的输出

0000000000000000吨系统时间 0000000000000000 d事件\u退出\u教学时间 0000000000000000 d事件\u输入\u教学法时间 0000000000000000 d\u系统调用\u元\u教学时间 0000000000000000 d类型\u教学时间 0000000000000000 d参数 0000000000000000 t跟踪起始标志输入教学时间 0000000000000000 t跟踪\u初始\u标志\u退出\u教学时间 0000000000000000 t\u事件\u退出\u教学时间 0000000000000000 t\u事件\u输入\u教学时间 0000000000000000 t\u p\u系统调用\u元\u教学时间 0000000000000000 t\uuuuuuu initcall\u trace\u init\u flags\u exit\uuuuuuuu educationTimeEarly 0000000000000000 t\uuuuuu initcall\u trace\u init\u flags\u enter\uuuuuu educationtimeearly

这意味着系统调用已正确注册

在我的用户空间计划中,我正在写:

#define __NR_pedagogictime 1326 //1326 is my system call number
struct timeval *now = (struct timeval *)malloc(sizeof(struct timeval));

    long ret = syscall(__NR_pedagogictime,0,now);
    if(ret)
            perror("syscall ");
但我得到了一个错误:

“系统调用:未实现函数”

我真的非常感谢你对我的帮助。谢谢

编辑:

顺便说一句,syscall()的汇编代码如下所示(如果有帮助):


您选择了错误的系统调用号码。看看内核是如何检查系统调用数限制的。例如(x86,32位):

因此,您可以看到此代码比较了
%eax
(系统调用号)和
nr\u系统调用
(系统调用表大小)。以上或相等的结果将导致
syscall\u badsys


您还需要修改标头。

为什么选择1326作为系统调用号?因为文件natty source/arch/ia64/include/asm/unistd.h中的最后一个系统调用的编号是1325,所以我将我的编号增加了一个。我怀疑您是否有ia64,您可能在x86_64上,这与我的想法完全不同。是的,这也是我的想法。从地址长度和使用的汇编模式来看,我怀疑这是x86_64。unistd_64.h中曾经有一个关于syscall表中没有间隙的警告;在Linux3中有一个巨大的重组。但我认为差距仍然存在问题,而且1326似乎高得令人怀疑。好的。我明白你的意思。由于该文件中的系统调用从1024开始:“natty source/arch/ia64/include/asm/unistd.h”,因此我得到的是1326号。当我把它改成303时,它开始工作了。非常感谢。但是,如果我只是在程序中使用符号常量uu NR_educationtime(定义见unistd.h as 1326和unistd_64.h as 303),它就无法解析符号。有什么原因吗?@ChandanApsangi,您可能正在使用系统的
/usr/include
,使用从发行版内核窃取的常量,而不是您修改过的版本。只需在代码中定义它,这样就不会弄乱系统。
    movl    $6, %esi
    movl    $1326, %edi
    movl    $0, %eax
    call    syscall
    cltq
496 ENTRY(system_call)
497         RING0_INT_FRAME                 # can't unwind into user space anyway
498         pushl_cfi %eax                  # save orig_eax
499         SAVE_ALL
500         GET_THREAD_INFO(%ebp)
501                                         # system call tracing in operation / emulation
502         testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
503         jnz syscall_trace_entry
504         cmpl $(nr_syscalls), %eax
505         jae syscall_badsys
506 syscall_call:
507         call *sys_call_table(,%eax,4)
508         movl %eax,PT_EAX(%esp)          # store the return value