+ -
当前位置:首页 → 问答吧 → 急切求助:增加的最简单的系统调用不能正常运行

急切求助:增加的最简单的系统调用不能正常运行

时间:2004-12-13

来源:互联网

我用的是redhat9.内核是2.4.20-8。增加系统调用的过程如下:
1。vi /usr/src/linux-2.4.20-8/kernel/sys.c
添加代码:(该系统调用仅仅返回一个整数值);
asmlinkage int sys_mycall(int number)
  {
  return number;
  }
2。vi /usr/src/linux-2.4.20-8/arch/i386/kernel/entry.S
添加:
.long SYMBOL_NAME(sys_mycall)
3。vi /usr/src/linux-2.4.20.-8/include/asm-i386/unistd.h
添加:
#define __NR_mycall 259 /*系统本身已有调用号已达258*/
4。这一步有的文章没有,有的又有,而且修改的文件好像说法不统一,所以 我干脆修改了两个。(这里也是比较困惑的地方).
vi /usr/include/linux/unistd.h
添加:
#define __NR_mycall 259

vi /usr/include/asm/unistd.h
添加:
#define __NR_mycall 259

5。重新编译内核,用编译过的内核重新引导系统。
6。重启,编写测试文件
vi tt.c
#include <stdio.h>
#include <linux/unistd.h>
  _syscall1(int,mycall,int,ret)
  main()
  {
  printf("%d \n",mycall(100));
  }

gcc -o tt tt.c
提示:
/tmp/cckyQ5Sb.o(.text+0x20): In function `mycall':
: undefined reference to `errno'
collect2: ld returned 1 exit status

我搜了一下论坛以前的帖子,发现有个兄弟出现过类似的情况,按照他的 解决办法,我在测试文件tt.c中加了个头文件
#include <errno.h>

再gcc -o tt tt.c
运行./tt
结果输出-1 (并不是预想的100);

请问各位大侠这是怎么回事呀??折腾了一天,看了无数个相关帖子,重新编译了n遍内核,快崩溃了55555555555。尤其是第4步,网上说法千差万别,有的修改这个,有的修改那个头文件。。。不知到底问题出在哪里

作者: mdxs   发布时间: 2004-12-13

可能的原因:

系统调用的返回值是用作错误处理的,当返回大于一定值时,会被自动处理成-1,并设置errno为你的返回值的负值。

下面是kernel 2.6.9的处理办法:
#define __syscall_return(type, res) \
do { \
if ((unsigned long)(res) >= (unsigned long)(-125)) { \
errno = -(res); \
res = -1; \
} \
return (type) (res); \
} while (0)
你可以参看kernel source的include/asm-i386/unistd.h

作者: phyma   发布时间: 2004-12-14

因为我把100改为1或者是0,还是得到-1。
似乎是调用时出的错吧,因为我在系统调用例程里
添加一句 printf("this is mysyscall\n");
也没有显示出来。

作者: mdxs   发布时间: 2004-12-14

作者: mdxs   发布时间: 2004-12-15

斑竹写的程序每行结尾都加 斜线(“\”)是什么意思啊!

幼稚问题,可以笑我,但请说说愿意!

谢谢!

作者: newhuman163   发布时间: 2004-12-16

我的理解
在linux中 如果一行有太多代码 可是有写不下 就使用 \来进行换行
而实际执行中 会把所有的认为是一行的

作者: z21921   发布时间: 2004-12-17

引用:
最初由 newhuman163 发表
斑竹写的程序每行结尾都加 斜线(“\”)是什么意思啊!

幼稚问题,可以笑我,但请说说愿意!

谢谢!
原因在于用#define进行宏定义的时候是限制每个define一行,“\”是用来续行的,有时一行太长不太好看明白

作者: phyma   发布时间: 2004-12-17