heqingbj
驱动小牛
驱动小牛
  • 注册日期2002-10-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1518回复:8

内核模块如何与用户空间的进程通讯阿

楼主#
更多 发布于:2002-11-29 10:38
譬如说一个应用:我有一个内核模块,还有一个用户空间得进程。 用户空间的进程监视网络情况,接受信息。然后它要通知内核模块到指定内存空间或者直接从文件上读取数据。请问如何实现阿。
  
heqingbj
驱动小牛
驱动小牛
  • 注册日期2002-10-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-09 19:05
上面的代码经过测试,肯定没问题。至于你所的内核的read就是write ,我不太清楚。


你的程序没有错误 就是往文件写 只是这个操作对于内核来说确实读取 其实没有什么的 表述不同而已
houyb
驱动牛犊
驱动牛犊
  • 注册日期2002-12-04
  • 最后登录2009-08-07
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-09 17:04
上面的代码经过测试,肯定没问题。至于你所的内核的read就是write ,我不太清楚。
heqingbj
驱动小牛
驱动小牛
  • 注册日期2002-10-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-05 11:40
 

在内核空间中不能调用fread、fwrite直接读写文件,用下列函数
可在内核空间中写文件,将write改成read就可读文件

#define _write(f, buf, sz) (f->f_op->write(f, buf, sz, &f->f_pos))
#define WRITABLE(f) (f->f_op && f->f_op->write)

#define BEGIN_KMEM { mm_segment_t old_fs = get_fs(); set_fs(get_ds());
#define END_KMEM set_fs(old_fs); }

int write_to_file(char *logfile, char *buf, int size)
{
  int ret = 0;
  struct file *f = NULL;

  lock_kernel();
  BEGIN_KMEM;
  f = filp_open(logfile, O_CREAT|O_APPEND, 00600);

  if (IS_ERR(f))
  {
    ret = -1;
  }
  else
  {
    if (WRITABLE(f))
      _write(f, buf, size);
    else
      ret = -1;

    ret = filp_close(f,NULL);
  }

  END_KMEM;
  unlock_kernel();

  return ret;
}


我怎么记得内核中刚好相反 内核READ其实是WRITE的
heqingbj
驱动小牛
驱动小牛
  • 注册日期2002-10-10
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-05 11:01
非常感谢各位同志的帮助 :) 让偶有了眉目 这段时间有些懒 具体程序还没有编 ;P 不过后来几位同志真是不好意思 偶刚开始给分给完了 后面的偶想给 确不知道如何给了 见谅见谅
bbs_000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-05
  • 最后登录2003-03-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-12-05 08:53
使用void memcpy_fromfs(void to*,const void *from,unsigned long count)和void memcpy_tofs(void *to,const void* from,unsigned long count)就可实现内核和用户空间之间的数据读写
houyb
驱动牛犊
驱动牛犊
  • 注册日期2002-12-04
  • 最后登录2009-08-07
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-12-04 17:29
譬如说一个应用:我有一个内核模块,还有一个用户空间得进程。 用户空间的进程监视网络情况,接受信息。然后它要通知内核模块到指定内存空间或者直接从文件上读取数据。请问如何实现阿。
  


在内核空间中不能调用fread、fwrite直接读写文件,用下列函数
可在内核空间中写文件,将write改成read就可读文件

#define _write(f, buf, sz) (f->f_op->write(f, buf, sz, &f->f_pos))
#define WRITABLE(f) (f->f_op && f->f_op->write)

#define BEGIN_KMEM { mm_segment_t old_fs = get_fs(); set_fs(get_ds());
#define END_KMEM set_fs(old_fs); }

int write_to_file(char *logfile, char *buf, int size)
{
  int ret = 0;
  struct file *f = NULL;

  lock_kernel();
  BEGIN_KMEM;
  f = filp_open(logfile, O_CREAT|O_APPEND, 00600);

  if (IS_ERR(f))
  {
    ret = -1;
  }
  else
  {
    if (WRITABLE(f))
      _write(f, buf, size);
    else
      ret = -1;

    ret = filp_close(f,NULL);
  }

  END_KMEM;
  unlock_kernel();

  return ret;
}





[编辑 -  12/4/02 by  houyb]

[编辑 -  12/4/02 by  houyb]
unix1998
驱动老牛
驱动老牛
  • 注册日期2002-05-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-11-29 16:27
ioctl是一个good idea.
yftty
驱动牛犊
驱动牛犊
  • 注册日期2002-11-06
  • 最后登录2010-12-07
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值1点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-11-29 16:15
譬如说一个应用:我有一个内核模块,还有一个用户空间得进程。 用户空间的进程监视网络情况,接受信息。然后它要通知内核模块到指定内存空间或者直接从文件上读取数据。请问如何实现阿。
  


Some way to resolve your problem:

1. using socket as data channle, kernel mod is server.
2. app using ioctl to info kernel mod to do so.
3. kernel mod using proc filesystem to fetch data.
/yftty http://www.unix-driver.org
游客

返回顶部