LinuxSir.cn,穿越时空的Linuxsir!

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

系统调用返回-1,我已经看了很多帖子了,但是还是解决不了。大家帮忙看看吧。^_^。。谢

[复制链接]
发表于 2005-5-14 19:15:30 | 显示全部楼层 |阅读模式
在/usr/src/linux-2.4.26/arch/i386/kernel/entry.S

.long SYMBOL_NAME (sys_ni_syscall)    后添加:


ifdef CONFIG_SHM
    .long SYMBOL_NAME(sys_printlogs)
    .long SYMBOL_NAME(sys_flush)
#endif /*CONFIG_SHM*/

在/usr/src/linux-2.4.26/include/asm/unistd.h

#define __NR_exit_group 252      后添加:

#ifdef CONFIG_SHM
#define __NR_printlogs    253
#define __NR_flush          254
#endif /*CONFIG_SHM*/


系统调用函数分别在文件
sys_flush():   /usr/src/linux-2.4.26/mig_shm/sync.c
sys_printlogs():  /usr/src/linux-2.4.26/mig_shm/log_info.c

另外头文件有:/usr/src/linux-2.4.26/include/linux/printlogs.h
#ifndef __LINUX_PRINTLOGS_H
#def    __LINUX_PRINTLOGS_H
#include <linux/linkage.h>
#include <linux/unistd.h>
__syscall0(long,printlogs)
#endif

头文件/usr/src/linux-2.4.26/mig_shm/flush.h
#ifndef __LINUX_FLUSH_H
#ifdef  __LINUX_FLUSH_H
#include <linux/linkage.h>
#include <liunx/unistd.h>
_syscall0(long,flush)
#endif

这是自由社区的一个项目,我自己也证明了系统调用在系统内部是可用,但我始终不能手动调用这两个系统调用。

我的方法是:/*print.c*/
#include<linux/printlogs.h>
int main()
{
    printlogs();
    return 0;
}


gcc -I /usr/src/linux-2.4.26/include print.c

出现错误:
In function ‘printlogs’:
:undefined reference to "error"
collect 2:Id return 1 exit status

在printlogs.h中添加#include<errno.h>可以通过编译,但返回-1。

各位大牛,帮忙看看吧,谢谢。。。。
发表于 2005-5-14 20:42:21 | 显示全部楼层
应该是_NR_syscalls 的问题.系统调用的个数需要修改
回复 支持 反对

使用道具 举报

发表于 2005-5-14 20:49:51 | 显示全部楼层
貌似个数不对,返回 -38(2.6) ,嘻嘻
不知道了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-14 22:11:31 | 显示全部楼层
2.然后把sys_addtotal(int )的入口地址添加到sys_call_table表中。该表依次存储所有系统调用的入口地址。

修改前为:

.long SYMBOL_NAME(sys_ni_syscall)    /* sys_set_tid_address 这是第258个系统调用* /

.rept NR_syscalls-(.-sys_call_table)/4

   .long SYMBOL_NAME(sys_ni_syscall)

修改后:

.long SYMBOL_NAME(sys_ni_syscall)       /* sys_set_tid_address *        /

.long SYMBOL_NAME(sys_addtotal)          /*这是增加的第259个系统调用*/

.rept NR_syscalls-(.-sys_call_table)/4-1      /*这里重复次数减少1*/

       .long SYMBOL_NAME(sys_ni_syscall)


倒数第二行的修改
.rept NR_syscalls-(.-sys_call_table)/4-1      /*这里重复次数减少1*/
是什么意思???

谢谢。。。
回复 支持 反对

使用道具 举报

发表于 2005-5-15 10:24:26 | 显示全部楼层
先搞清楚 .rept 是怎么回事:

.rept count
Repeat the sequence of lines between the .rept directive and the next .endr di
rective count times.
For example, assembling
.rept 3
.long 0
.endr
is equivalent to assembling
.long 0
.long 0
.long 0

减 1 就是说空函数少一个,因为已经被你的一个函数使用了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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