Chinaunix首页 | 论坛 | 博客
  • 博客访问: 38931
  • 博文数量: 23
  • 博客积分: 1065
  • 博客等级: 少尉
  • 技术积分: 185
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-14 15:32
文章分类

全部博文(23)

文章存档

2010年(20)

2008年(3)

我的朋友
最近访客

分类: LINUX

2010-03-02 00:04:50

应用程序中通过mmap()的方法把一段内核的缓冲区映射到用户空间.
一方面,内核缓冲区中的数据被另外一个内核"写进程"(DMA操作)不断的更新;
另一方面,应用程序需要不停的把缓冲区的数据保存到一个文件中.

我想请教的问题是:两个过程的同步问题!
因为两个进程一个在用户空间,一个在内核空间,显然两者都无法直接知道
对方在缓冲区中的读写位置.

我想到的解决办法有两个.
    一个是应用程序里通过ioctl的系统调用,把当前应用程序在缓冲区中的"读"
位置告诉内核的驱动程序,而内核的驱动程序则负责处理这个位置后返回一个
内核中"写"位置给应用程序,这样就可以实现两者的同步问题.这种方法有一个问题
就是要频繁的使用系统调用.
    另外一种方法是应用程序每次调用mmap()的时候都是一个固定的长度,把数据
保存后就munmap(),然后又一次mmap().而驱动程序中就要为缓冲区设置另一个读
的指针,每调用一次mmap()就把返回的地址更新,即在缓冲区中向前移一个固定的长度.
这种方法同样要频繁的使用系统调用.而且实现起来更复杂,也更不可靠.
    就这两种方法而言,我是比较倾向与前者的.请各位大虾给点意见好么?最好是
能提供一些其他的办法,那就更加感激不尽了,bow

PS:用read()等系统调用的方法我已经实现了,现在是想实现一下"零拷贝"的方法,即
不想从内核空间到用户空间拷贝数据.
阅读(464) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~