免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2011 | 回复: 6
打印 上一主题 下一主题

请问:如何在驱动程序中实现对文件的操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-05 16:14 |只看该作者 |倒序浏览
主要问题是如何在内核里实现向文件里写数据。

通过阅读高手在其他类似贴中留下的内容,我写了下面的代码:
unsigned char writefile(const char *data,int len)
{
  mm_segment_t old_fs;
  ssize_t result;
  struct file *filp=NULL;
  char *filename="param.txt";

  filp=filp_open(file_name,O_RDWR,0);
  if (IS_ERR(filp))
  {
    printk(KERN_INFO "Unable to load %s.\n",filename);
    return -1;
  }
  if((!filp-> f_op) ¦ ¦(!filp-> f_op-> write))
  {
    filp_close(filp,NULL);
    return -1;
  }
  old_fs=get_fs();
  set_fs(get_ds());
  result=filp-> f_op-> write(filp,data,len,&filp-> f_pos);
  printk("result=%d\n",result);
  set_fs(old_fs);
  return 0;
}

编译通过,正常insmod,但是运行时会死掉,自然写文件没有成功。
如果把get_fs,set_fs这些去掉,则不会死,但是write返回一个负值-14,没有写成功。
经过试验我发现好像是set_fs的问题,用他就会死,不知道怎么回事,高手来指点一下吧,不甚感激。

论坛徽章:
0
2 [报告]
发表于 2008-03-05 20:30 |只看该作者
不知道注意了没有,这里的data必须是用户空间的,因为write使用了copy_from_user

论坛徽章:
0
3 [报告]
发表于 2008-03-06 15:18 |只看该作者
我也想知道 应该是什么样子的

论坛徽章:
0
4 [报告]
发表于 2008-03-06 21:03 |只看该作者
到底该怎么办呢?求高手指点呀,而且为什么执行到set_fs就会死机呢。。。。

论坛徽章:
0
5 [报告]
发表于 2008-03-08 08:39 |只看该作者
首先看看-14是什么错误
第二,如果不能解决问题,参照loop.c 或者generic_file_write的做法,把write分解,然后,看在哪个地方出错。
如有需要,我这里有个程序

论坛徽章:
0
6 [报告]
发表于 2008-03-09 21:52 |只看该作者
loop.c,generic_file_write在哪里可以看到呢?您的程序我想参考一下。
请楼上高人赐教,呵呵。

论坛徽章:
0
7 [报告]
发表于 2008-03-09 23:44 |只看该作者
程序就不给了,怡笑大方了,完全照抄loop.c的东西,在redhat9下可以通过

loop.c就是环回设备的驱动程序,lo_send这个函数实现了文件的写入。
或者可以看看generic_file_write这个函数,完全一样,在filemap.c里面,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP