LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 723|回复: 2

为何内核只容许添加一个自定义的系统调用?

[复制链接]
发表于 2005-8-19 10:17:10 | 显示全部楼层 |阅读模式
大家好。我现在参考有关资料在尝试增加一自定义的系统调用。首先一切正常,也看到了预期的结果:
我的机器是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函数,第二个就工作。好象,只容许你添加一个自定义的系统调用。
可有哪位帮我诊断一下,谢谢!
发表于 2005-8-19 10:39:33 | 显示全部楼层
看在/proc/kallsyms里找得到sys_mycall不.
回复 支持 反对

使用道具 举报

发表于 2005-8-19 10:55:31 | 显示全部楼层
No idea about this problem. One possibility is that the number "_NR_mycall" that you defined has exceeded "_NR_syscalls" which is the limit of the system call number. In Linux-2.6, "_NR_syscalls" is 274 but all 275(0-274) system calls have been used up, so you have to increase the number in order to use your own system calls. But in Linux-2.4, there should be some unassigned numbers there.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表