LinuxSir.cn,穿越时空的Linuxsir!

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

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

[复制链接]
发表于 2004-12-13 13:54:02 | 显示全部楼层 |阅读模式
我用的是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步,网上说法千差万别,有的修改这个,有的修改那个头文件。。。不知到底问题出在哪里:help
发表于 2004-12-14 09:51:41 | 显示全部楼层
可能的原因:

系统调用的返回值是用作错误处理的,当返回大于一定值时,会被自动处理成-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
 楼主| 发表于 2004-12-14 17:49:23 | 显示全部楼层

好像不是返回值的问题

因为我把100改为1或者是0,还是得到-1。
似乎是调用时出的错吧,因为我在系统调用例程里
添加一句 printf("this is mysyscall\n");
也没有显示出来。
 楼主| 发表于 2004-12-15 10:50:21 | 显示全部楼层

已解决,谢谢指点

:thank
发表于 2004-12-15 20:26:26 | 显示全部楼层

新手问题:)

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

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

  谢谢!
发表于 2004-12-17 10:02:31 | 显示全部楼层
我的理解
在linux中 如果一行有太多代码 可是有写不下 就使用 \来进行换行
而实际执行中 会把所有的认为是一行的
发表于 2004-12-17 10:34:36 | 显示全部楼层

回复: 新手问题:)

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

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

  谢谢!


原因在于用#define进行宏定义的时候是限制每个define一行,“\”是用来续行的,有时一行太长不太好看明白
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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