应用程序中通过mmap()的方法把一段内核的缓冲区映射到用户空间.
一方面,内核缓冲区中的数据被另外一个内核"写进程"(DMA操作)不断的更新;
另一方面,应用程序需要不停的把缓冲区的数据保存到一个文件中.
我想请教的问题是:两个过程的同步问题!
因为两个进程一个在用户空间,一个在内核空间,显然两者都无法直接知道
对方在缓冲区中的读写位置.
我想到的解决办法有两个.
一个是应用程序里通过ioctl的系统调用,把当前应用程序在缓冲区中的"读"
位置告诉内核的驱动程序,而内核的驱动程序则负责处理这个位置后返回一个
内核中"写"位置给应用程序,这样就可以实现两者的同步问题.这种方法有一个问题
就是要频繁的使用系统调用.
另外一种方法是应用程序每次调用mmap()的时候都是一个固定的长度,把数据
保存后就munmap(),然后又一次mmap().而驱动程序中就要为缓冲区设置另一个读
的指针,每调用一次mmap()就把返回的地址更新,即在缓冲区中向前移一个固定的长度.
这种方法同样要频繁的使用系统调用.而且实现起来更复杂,也更不可靠.
就这两种方法而言,我是比较倾向与前者的.请各位大虾给点意见好么?最好是
能提供一些其他的办法,那就更加感激不尽了,bow
PS:用read()等系统调用的方法我已经实现了,现在是想实现一下"零拷贝"的方法,即
不想从内核空间到用户空间拷贝数据.
阅读(339) | 评论(0) | 转发(0) |