当前位置: 技术问答>linux和unix
在用户程序中怎样调用内核函数?
来源: 互联网 发布时间:2015-01-15
本文导语: 如题! 请各位大虾指点!高分酬谢! | 内核函数是通过系统调用的, 系统调用的时候会检查权限 asm("int $0x80")来实现的 | 1. # vi /usr/src/linux/kernel/sys.c 在文件的最后增加一...
如题!
请各位大虾指点!高分酬谢!
请各位大虾指点!高分酬谢!
|
内核函数是通过系统调用的,
系统调用的时候会检查权限
asm("int $0x80")来实现的
系统调用的时候会检查权限
asm("int $0x80")来实现的
|
1.
# vi /usr/src/linux/kernel/sys.c
在文件的最后增加一个系统调用函数:
asmlinkage int sys_print_info(int testflag)
{
printk(" Its my syscall function!n");
return 0;
}
该函数有一个int型入口参数testflag,并返回整数0。
2.
vi /usr/src/linux/arch/i386/kernel/entry.S
把函数的入口地址加到sys_call_table表中:
.long SYMBOL_NAME(sys_print_info)
.rept NR_syscalls-191 (数字加一)
3
vi /usr/src/linux/include/asm/unistd.h
把增加的sys_call_table表项所对应的向量,在include/asm/unistd.h中进行必要申明,以供用户进程和其他系统进程查询或调用。
#define __NR_print_info 191
4
编译内核
#my.c
_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为入口参数名。
# vi /usr/src/linux/kernel/sys.c
在文件的最后增加一个系统调用函数:
asmlinkage int sys_print_info(int testflag)
{
printk(" Its my syscall function!n");
return 0;
}
该函数有一个int型入口参数testflag,并返回整数0。
2.
vi /usr/src/linux/arch/i386/kernel/entry.S
把函数的入口地址加到sys_call_table表中:
.long SYMBOL_NAME(sys_print_info)
.rept NR_syscalls-191 (数字加一)
3
vi /usr/src/linux/include/asm/unistd.h
把增加的sys_call_table表项所对应的向量,在include/asm/unistd.h中进行必要申明,以供用户进程和其他系统进程查询或调用。
#define __NR_print_info 191
4
编译内核
#my.c
_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为入口参数名。
|
用户态下不能随便调用内核函数的,内核可以把一些常用的功能以系统调用的方式提供给你。如果用户态下可以随意调用内核函数的话,岂不天下大乱,要知道在内核态想干什么就干什么。
如果你一定要调用内核函数,可以修改内核向系统调用表中加些你想调用的东西,或是做个模块。
如果你一定要调用内核函数,可以修改内核向系统调用表中加些你想调用的东西,或是做个模块。