LinuxSir.cn,穿越时空的Linuxsir!

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

求救!!关于添加系统调用,无法改表大小。。。

[复制链接]
发表于 2005-3-17 15:40:16 | 显示全部楼层 |阅读模式
我用动态添加模块的方法添加多个系统调用,现在的问题是,内核的sys_call_table好像不是链表,我现在怎样才能加大sys_call_table呢,而不是覆盖已经存在的sys_call_table的表项(那样会导致被覆盖的系统调用失效)
发表于 2005-3-17 15:57:18 | 显示全部楼层
编辑入口表文件:
# cd /usr/src/linux/arch/i386/kernel
# vi entry.S
把函数的入口地址加到sys_call_table表中:
arch/i386/kernel/entry.S中的最后几行源代码修改前为:
ys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */
rept NR_syscalls-190
.....添加你自己的调用符号
......调用的数目加一
.long SYMBOL_NAME(sys_ni_syscall)
.endr
修改后为:
......
.long SYMBOL_NAME(sys_sendfile)
.long SYMBOL_NAME(sys_ni_syscall) /* streams1 */
.long SYMBOL_NAME(sys_ni_syscall) /* streams2 */
.long SYMBOL_NAME(sys_vfork) /* 190 */
.long SYMBOL_NAME(sys_print_info) /* added by I */
.rept NR_syscalls-191
.endr
修改相应的头文件:
# cd /usr/src/linux/include/asm
# vi unistd.h
把增加的sys_call_table表项所对应的向量,在include/asm/unistd.h中进行必要申明,以供用户进程和其他系统进程查询或调用。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-17 16:29:28 | 显示全部楼层
哦,你这个是用修改内核的办法搞定的喔
我希望能不修改内核,而用动态加载模块的办法,所以受到了sys_call_table大小的限制
不过我突然觉得下面这样也许可以投机取巧的解决(依然使用加载模块,修改sys_call_table的办法,因为编译内核太耗时):
因为函数sys_ni_syscall(在kernel/sys.c中)为空操作
所以在entry.S中凡是写成.long SYMBOL_NAME(sys_ni_syscall)的表项都可以被覆盖成自己的系统调用
在2.4.20中有很多个这样的表项,已经满足我的需求了
谢谢你!
回复 支持 反对

使用道具 举报

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

本版积分规则

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