当前位置: 技术问答>linux和unix
郁闷啊!系统调用添加问题?
来源: 互联网 发布时间:2015-02-28
本文导语: 这个问题困扰我几天了。我按以下步骤添加系统调用,为什么不行?系统老是说 xtdy.c: In function `mycall': xtdy.c:3: `__NR_mycall' undeclared (first use in this function) xtdy.c:3: (Each...
这个问题困扰我几天了。我按以下步骤添加系统调用,为什么不行?系统老是说
xtdy.c: In function `mycall':
xtdy.c:3: `__NR_mycall' undeclared (first use in this function)
xtdy.c:3: (Each undeclared identifier is reported only once
xtdy.c:3: for each function it appears in.)
xtdy.c:3: `errno' undeclared (first use in this function) (我用的是redhat7。3,内核是2。4。18-3的,装在virtualpc上的)
各位高手帮帮忙,我编译一次内核要花将近一个小时,我不想再浪费时间了。
添加步骤:
1、编写系统调用函数
编辑sys.c文件:
# cd /usr/src/linux/kernel
# vi sys.c
在文件的最后增加一个系统调用函数:
asmlinkage int sys_print_info(int testflag)
{
printk(" It's 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) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */
rept NR_syscalls-190
.long SYMBOL_NAME(sys_ni_syscall)
.endr
修改后为:
......
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */
.long SYMBOL_NAME(sys_print_info) /* added by I */
.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 /* added by I */
3、编译内核,再重启动,进入新内核
4、测试
编写用户测试程序(xtdy.c):
# vi xtdy.c
#include
_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 xtdy xtdy.c
执行测试程序:
# ./xtdy
It's my syscall function!
i=0, syscall success!
|
有没有把新内核的System.map拷到/boot下?