日期:2014-05-16  浏览次数:20958 次

添加系统调用后,调用时总是返回-1,为什么?
用的suse10,版本2.6.13
我的步骤是
1、在/usr/src/linux/kernel-2.6.13/sys.c文件中添加源代码,如下所示:  
  asmlinkage   int   sys_mycall(int   number)  
      {  
                return   number;  
      }  
2、在/usr/src/linux/include/asm-i386/unistd.h   中添加
      #define   __NR_mycall   295(我的内核中最后一个是294)
3、/usr/src/linux/arch/i386/kernel/sys_call_table.s中添加
      .long   sys_mycall
4、编译内核,这一步没有问题
5、调用新的系统调用
      程序:
      #include   <linux/unistd.h>
      #include <errno.h>
      _syscall1(int,mycall,int,number)
      int   main()
      {
                int   ret;
                ret   =   mycall(100);
                printf( "%d\n ",ret);
                return   0;
      }
6、编译后运行,本来结果应该是100,可是真正结果是-1……
      为什么啊?哪位大虾遇到过这个问题或者知道怎么解决啊?帮帮忙!!

------解决方案--------------------
1、在/usr/src/linux/kernel-2.6.13/sys.c文件中添加源代码,如下所示:
  asmlinkage int sys_mycall(int number)
{
return number;
}
3、/usr/src/linux/arch/i386/kernel/sys_call_table.s中添加
.long sys_mycall
这两个函数怎么一样??sys_call_table.s中应该添加:
mycall:
mov eax, 295
call 80h
ret

然后再在系统调用函数列表sys_table中增加sys_mycall


以上是参考,具体版本使用的数据结构名字,在代码里面找找