我正在尝试向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类型 _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
答案 0 :(得分:3)
您选择了错误的系统调用号码。看一下内核如何检查系统调用号限制here。例如(x86,32bit):
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
(系统调用号)和nr_syscalls
(sys_call_table大小)。高于或等于syscall_badsys
。
您还需要修改arch/x86/include/asm/unistd_32.h标题。