免费注册 查看新帖 |

Chinaunix

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

关于kernel和用户进程内存映射,进行读写问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-22 12:42 |只看该作者 |倒序浏览
driver将kernel内存空间映射到user空间.(remap_pfn_range + mmap)
之后driver写数据,用户进程读数据。
读写的排他操作怎么实现?

论坛徽章:
0
2 [报告]
发表于 2010-07-22 14:01 |只看该作者
回复 1# lnkinprk


    你的意思是不是如何实现同步?

论坛徽章:
0
3 [报告]
发表于 2010-07-22 14:06 |只看该作者
我觉得像这种 kernel space write, user space read 不加同步机制应该也没多大问题吧。

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
4 [报告]
发表于 2010-07-22 15:52 |只看该作者
回复 3# wmmy2008


还是有问题的
比如用户在读,突然driver来了数据,中断当前读
driver向内存写数据
之后用户恢复读,这样前后数据就不一致了

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
5 [报告]
发表于 2010-07-22 16:01 |只看该作者
要实现同步的话得由driver控制读吧
即建立一个设备节点,用户访问设备节点或者设备文件
driver提供读取内存的read函数

论坛徽章:
0
6 [报告]
发表于 2010-07-22 16:28 |只看该作者
回复 4# openspace


    不一致就不一致撒,,读到的都是最新的数据,只要不会导致程序状态出错就可以了。。
还有就是你说的 要实现同步的话得由driver控制读 ,我觉得这不行吧,,,它是直接在用户空间读内存(映射kernel的内存),又不会调用到你的设备文件的read操作方法.

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
7 [报告]
发表于 2010-07-22 17:39 |只看该作者
回复 6# wmmy2008


    把内存映射替换掉

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
8 [报告]
发表于 2010-07-22 17:44 |只看该作者
“不一致就不一致撒,,读到的都是最新的数据,只要不会导致程序状态出错就可以了。”
这就是难点
加入driver写的数据为类似记录的格式
用户态在读到一条记录的前几个字段后被中断了
接着读获取的是新的数据
这样同一条记录的字段就不一致了

论坛徽章:
0
9 [报告]
发表于 2010-07-23 00:17 |只看该作者
也许可以搞个循环队列, 可以参考 E1000 网卡的发送,接受QUEUE.

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
10 [报告]
发表于 2010-07-23 07:41 |只看该作者
问题在于用户态做的mmap,所以循环队列的互斥控制没法对用户态起作用
感觉LZ要换种做法,那就得改动用户态程序
可以这样想,你自己提供了一个driver可以获取数据,然后再提供一个用户态工具包来获取这些数据
工具包的实现自己决定,那就可以避开mmap,除非客户有要求
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP