3

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

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

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

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

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

0000000000000000 T sys_pedagogictime 0000000000000000 d event_exit__pedagogictime 0000000000000000 d event_enter__pedagogictime 0000000000000000 d __syscall_meta_ pedagogictime 0000000000000000 d types _pedagogictime 0000000000000000 d args__pedagogictime 0000000000000000 t trace_init_flags_enter__pedagogictime 0000000000000000 t trace_init_flags_exit__pedagogictime 0000000000000000 t __event_exit__pedagogictime 0000000000000000 t __event_enter__pedagogictime 0000000000000000 t __p_syscall_meta__pedagogictime 0000000000000000 t __initcall_trace_init_flags_exit__pedagogictimeearly 0000000000000000 t __initcall_trace_init_flags_enter__pedagogictimeearly

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

在我的用户空间程序中,我正在写:

#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() 的汇编代码如下所示(如果有帮助的话):

    movl    $6, %esi
    movl    $1326, %edi
    movl    $0, %eax
    call    syscall
    cltq
4

1 回答 1

3

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

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

因此,您可以看到此代码比较了%eax(syscall number) 和nr_syscalls(sys_call_table size)。高于或等于导致syscall_badsys

您还需要修改arch/x86/include/asm/unistd_32.h标头。

于 2012-06-28T05:35:25.727 回答