添加系统调用后,调用时总是返回-1,为什么?

zhp_0518 2007-05-10 01:35:10
用的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……
为什么啊?哪位大虾遇到过这个问题或者知道怎么解决啊?帮帮忙!!
...全文
1512 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhp_0518 2007-05-13
  • 打赏
  • 举报
回复
我进入管理页面,然后给jbh811() 的帖子后面写上20,发出回复后怎么还是显示0分呢?
jbh811 2007-05-12
  • 打赏
  • 举报
回复
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


以上是参考,具体版本使用的数据结构名字,在代码里面找找
jbh811 2007-05-12
  • 打赏
  • 举报
回复
呵呵,我现在看的还是0.11的老版本呢,不过基本原理应该是差不多的:)
zhp_0518 2007-05-12
  • 打赏
  • 举报
回复
怎么给分啊?
zhp_0518 2007-05-12
  • 打赏
  • 举报
回复
终于解决了!!
zhp_0518 2007-05-12
  • 打赏
  • 举报
回复
终于搞定了。
错误在于
2、在/usr/src/linux/include/asm-i386/unistd.h 中添加
#define __NR_mycall 295(我的内核中最后一个是294)
其实294号是#define NR_syscall 294,这个是sys_table中能使用的编号的最大值,我把新的系统调用加在它的后面,自然在使用系统调用的时候找不到,返回-1据说是没有执行的意思。
解决方法是将/usr/src/linux/include/asm-i386/unistd.h 的
#define NR_syscall 294改为
#define __NR_mycall 294
#define NR_syscall 295
重新编译内核,成功!
我在网上看的很多的方法都没有提到这些,都说是直接加在最后就行了。
ls的最后一句话对我很有启发,谢谢!
mymtom 2007-05-11
  • 打赏
  • 举报
回复
内核安装了吗?
zhp_0518 2007-05-11
  • 打赏
  • 举报
回复
xtdy.c: In function ‘main’:
xtdy.c:11: warning: incompatible implicit declaration of built-in function ‘printf’
/tmp/ccAeG7dA.o: In function `mycall':
/home/fish/file/vROM/diaoyong/xtdy.c:3: undefined reference to `errno'
collect2: ld returned 1 exit status
这是没有加errno.h时的错误
zhp_0518 2007-05-11
  • 打赏
  • 举报
回复
我重新编译内核后出来了一个新的内核,我并没有删除旧的内核,电脑启动时直接选选择新的内核,不就进的是新内核吗?必须删除原来的内核吗?
我编译内核的过程是
make mrproper
make menuconfig(直接保留它的默认设置)
make
make modules
make modules_install
make install
这时候suse的grub里就出现了一个新的内核
我在启动的时候直接进的新内核,对吗?
mymtom 2007-05-11
  • 打赏
  • 举报
回复
LS说得对 error 时什么?

LZ说:
内核安装了啊,重新编译内核后才用测试程序的,可是总是返回-1
-------
我想问的是:新内核安装了吗?
重新编译内核后,需要安装新内核(用你编译出来的内核替换原来的内核),然后重新启动,
这时你新加的系统调用才能启动!
zhp_0518 2007-05-11
  • 打赏
  • 举报
回复
不加errno.h就编译不通过,加了可以编译成功,但是返回-1。不知道为什么
kf701 2007-05-11
  • 打赏
  • 举报
回复
errno ?
zhp_0518 2007-05-11
  • 打赏
  • 举报
回复
内核安装了啊,重新编译内核后才用测试程序的,可是总是返回-1
zhp_0518 2007-05-10
  • 打赏
  • 举报
回复
笔误,/usr/src/linux/kernel-2.6.13/sys.c应该是/usr/src/linux-2.6.13/kernel/sys.c
其他linux都是linux-2.6.13,大虾帮忙啊!!!

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧