- 论坛徽章:
- 0
|
大家好。我现在参考有关资料在尝试增加一自定义的系统调用。首先一切正常,也看到了预期的结果:
我的机器是Redhat 9,kernel为默认的2.4.20-8
1)在/usr/src/linux-2.4.20-8/kernel/sys.c中增加一自定义函数varx_info,
……
asmlinkage int sys_varx_info(int testflag)
{
return testflag;
}
2)在/usr/src/linux-2.4.20-8/arch/i386/kernel/entry.S中增加一条语句
……
.long SYMBOL_NAME(sys_ni_syscall)
.long SYMBOL_NAME(sys_set_tid_address)
.long SYMBOL_NAME(sys_varx_info) /* 添加的一条语句 */
.rept NR_syscalls-(.-sys_call_table)/4
.long SYMBOL_NAME(sys_ni_syscall)
.endr
3)在 /usr/src/linux-2.4.20-8/include/asm/unistd.h中添加一条语句
#define __NR_lookup_dcookie 253
#define __NR_set_tid_address 258
#define __NR_varx_info 259
4)重新编译内核(过程略)
5)创建一简单的系统调用程序test.c:
#include <stdio.h>;
#include <linux/unistd.h>;
#include "errno.h"
_syscall1 (int,varx_info,int,testflag)
main()
{
int j;
j=varx_info(5);
printf("j=%d,syscall success!\n",j);
}
6)编译test.c
gcc -I /usr/src/linux-2.4.20-8/include test.c -o test
7)执行test,结果为:
j=5,syscall success!
但接下去的问题是我再添加一个自定义的系统调用,好象就不工作了。为了简化问题,我就编写了一个同前面一模一样功能的函数,如下:
在/usr/src/linux-2.4.20-8/kernel/sys.c中又增加一自定义函数macall,
……
asmlinkage int sys_varx_info(int testflag)
{
return testflag;
}
/*新添加的函数*/
asmlinkage int sys_mycall(int num)
{
return num;
}
余下设置都同上面。然后再创建一个系统调用程序test2.c:
#include <stdio.h>;
#include <linux/unistd.h>;
#include "errno.h"
_syscall1 (int,mycall,int,num)
main()
{
int j;
j=mycall(5);
printf("j=%d,syscall success!\n",j);
}
结果执行test2.c,结果为:
j=-1,syscall success!
这里j没有按预期那样给出5的结果。
注意,我检查了一个晚上,排除了人为输入错误的可能性。而且,如果我取消了第一个varx_info函数,第二个就工作。好象,只容许你添加一个自定义的系统调用。
可有哪位帮我诊断一下,谢谢! |
|