+ -
当前位置:首页 → 问答吧 → linux下如何改变系统调用

linux下如何改变系统调用

时间:2011-07-18

来源:互联网

大虾,我最近改变linux的系统调用,比如吧sys_open改成自己的函数,模块加载了后出现“已杀死”,卸载模块的时候出现“模块正在使用”。
想请问这是怎么个回事。代码我贴下来:
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/module.h>
#include<linux/sched.h>
#include<asm/unistd.h>
#include<linux/types.h>
#include<linux/dirent.h>
#include<linux/string.h>
#include<linux/file.h>
#include<linux/fs.h>



void **sys_call_table = 0xc0596150;//这个常量是我在/proc/kallsyms中找到的sys_call_table的对应值
asmlinkage long (* orig_open)(const char __user *filename, int flags, int mode);//存储原来sys_open的值
asmlinkage long my_sys_open_call(const char __user *filename, int flags, int mode);//自己定义的用来替代原来sys_open的函数

asmlinkage long my_sys_open_call(const char __user *filename,int flags,int mode)
{
return orig_open("111.txt",flags,mode);//调用原来sys_open函数打开文件
}

static int __init my_init(void)
{  
orig_open = sys_call_table[__NR_open];
sys_call_table[__NR_open] = my_sys_open_call;
return 0;
}

static void __exit my_exit_call(void)
{
sys_call_table[__NR_open] = orig_open;
}
module_init(my_init);
module_exit(my_exit_call);

作者: jiexiaoqihanxuebaoma   发布时间: 2011-07-18

可能是("111.txt" 这个参数的原因吧。 
人家是 const char __user *filename

来自用户空间的,使用copy-from-user 获取,你这个是内核空间的所以不行

作者: lvyinghong   发布时间: 2011-07-19

不妨参考一下系统的open函数是怎么处理这个参数的

作者: lvyinghong   发布时间: 2011-07-19

热门下载

更多