linux下编写自己的系统调用函数

1、编写系统调用函数
编辑sys.c文件:
# cd /usr/src/linux/kernel
# vi sys.c
在文件的最后增加一个系统调用函数:
asmlinkage int sys_print_info(int testflag)
{
printk(" Its my syscall function!n");
return 0;
}
该函数有一个int型入口参数testflag,并返回整数0。

2、修改与系统调用号相关的文件
编辑入口表文件:
# cd /usr/src/linux/arch/i386/kernel
# vi entry.S
把函数的入口地址加到sys_call_table表中:
arch/i386/kernel/entry.S中的最后几行源代码修改前为:
......
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_vfork)
rept NR_syscalls-190
.long SYMBOL_NAME(sys_ni_syscall)
.endr
修改后为:
......
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_vfork)
.long SYMBOL_NAME(sys_print_info)
.rept NR_syscalls-191
.endr
修改相应的头文件:
# cd /usr/src/linux/include/asm
# vi unistd.h
把增加的sys_call_table表项所对应的向量,在include/asm/unistd.h中进行必要申明,以供用户进程和其他系统进程查询或调用。
#define __NR_putpmsg 189
#define __NR_vfork 190
#define __NR_print_info 191

3、编译内核,再重启动

4、测试
编写用户测试程序(test.c):
# vi test.c
#include
#include
extern int errno;
_syscall1(int,print_info,int,testflag)
main()
{
int i;
i= print_info(0);
if(i==0)
printf("i=%d , syscall success!n",i);
}
如果要在用户程序中使用系统调用函数,那么在主函数main前必须申明调用_syscall,其中1 表示该系统调用只有一个入口参数,第一个int 表示系统调用的返回值为整型,print_info为系统调用函数名,第二个int 表示入口参数的类型为整型,testflag为入口参数名。
编译测试程序:
# gcc -o test test.c
执行测试程序:
# ./test
Its my syscall function!
i=0, syscall success!
ok!增加系统调用函数成功。

你可能感兴趣的:(linux驱动)