我给你一段代码,我用过的
static inline _syscall3(int,read,int,fd,char *,buf,off_t,count)
static inline _syscall3(off_t,lseek,int,fd,off_t,offset,int,count)
void hehe(void *m,unsigned off,int sz)
{
mm_segment_t old_fs_value=get_fs();
set_fs(get_ds());//关键是修改系统的堆栈为用户的堆栈
if (lseek(kmem,off,0)!=off)//这样就可以用系统调用了
{
printk("kmem lseek error in read/n"); return;
}
if (read(kmem,m,sz)!=sz)//这里也是系统调用
{
printk("kmem read error!/n"); return;
}
set_fs(old_fs_value);//恢复到系统堆栈
}
主要原因是在用系统调用时,内核会检查所传递的参数是不是用户空间的,如果不是就要报错,在写模块时,所有的变量都是在内核空间,所以只能显式地修改堆栈参数!好运!