免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1466 | 回复: 3
打印 上一主题 下一主题

内核只容许添加一个自定义的系统调用。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-18 19:05 |只看该作者 |倒序浏览
大家好。我现在参考有关资料在尝试增加一自定义的系统调用。首先一切正常,也看到了预期的结果:
我的机器是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函数,第二个就工作。好象,只容许你添加一个自定义的系统调用。
可有哪位帮我诊断一下,谢谢!

论坛徽章:
0
2 [报告]
发表于 2005-09-08 15:59 |只看该作者

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

我也遇到了同样的问题 同问同问

论坛徽章:
0
3 [报告]
发表于 2005-09-08 18:45 |只看该作者

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

不同版本规定一个自己的最大系统调用数目,超过了它就不行了。你可以选择那些nisyscall-也就是已经被废弃了的调用号来实现。

论坛徽章:
0
4 [报告]
发表于 2005-09-09 13:54 |只看该作者

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

果然是这样 ^_^ 试了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP