急切求助:增加的最简单的系统调用不能正常运行
时间:2004-12-13
来源:互联网
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
似乎是调用时出的错吧,因为我在系统调用例程里
添加一句 printf("this is mysyscall\n");
也没有显示出来。
作者: mdxs 发布时间: 2004-12-14
作者: mdxs 发布时间: 2004-12-15
幼稚问题,可以笑我,但请说说愿意!
谢谢!
作者: newhuman163 发布时间: 2004-12-16
在linux中 如果一行有太多代码 可是有写不下 就使用 \来进行换行
而实际执行中 会把所有的认为是一行的
作者: z21921 发布时间: 2004-12-17
最初由 newhuman163 发表 斑竹写的程序每行结尾都加 斜线(“\”)是什么意思啊! 幼稚问题,可以笑我,但请说说愿意! 谢谢! |
作者: phyma 发布时间: 2004-12-17
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28