我正在尝试向Linux内核添加新的(虚拟)系统调用。
1)我在linux-source/kernel/myfile.c文件中添加了系统调用代码,并相应地更新了Makefile。
2)我更新了syscall.h、unistd.h和entry.S文件,以反映新的系统调用(pedagogictime(int flag,struct timeval * time))。
然后编译内核并安装和重启镜像。当我运行命令:
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
这意味着系统调用已正确注册。
在我的用户空间程序中,我正在编写:
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:功能未实现"
如果有任何帮助,我将非常感激。谢谢。
编辑:
顺便说一下,syscall()的汇编代码如下:
movl $6, %esi
movl $1326, %edi
movl $0, %eax
call syscall
cltq