免费注册 查看新帖 |

Chinaunix

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

关于用户空间和内核空间共享内存时的互斥问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-20 11:28 |只看该作者 |倒序浏览
20可用积分
linux 提供多种共享内存的方式:mmap及shm等。但这些多是用于进程间共享内存,在进程空间,对内存的互斥访问可以通过semaphore或其它方式。
但如果是用户空间和内核空间共享内存的话,如何实现对共享内存的互斥访问呢?另外,用户空间如何知道共享内存的地址呢,即kernel如何通知user共享内存的地址和大小?还请各位高人指点迷津?

论坛徽章:
0
2 [报告]
发表于 2009-04-20 13:58 |只看该作者
没有人吗?自己顶下先。

论坛徽章:
0
3 [报告]
发表于 2009-04-20 14:49 |只看该作者
原帖由 allenlu1212 于 2009-4-20 11:28 发表
linux 提供多种共享内存的方式:mmap及shm等。但这些多是用于进程间共享内存,在进程空间,对内存的互斥访问可以通过semaphore或其它方式。
但如果是用户空间和内核空间共享内存的话,如何实现对共享内存的互斥 ...

类似的问题这里以前讨论过。现成的用户和内核共享内存的方法多通过/dev/mem让用户访问内核地址。
但现在较新的内核默认情况下禁止用户态通过/dev/mem访问内核地址。

至于互斥,没有现成的机制来实现。

内核和用户态通讯有很多现成框架,不一定非要使用你说的方法。比如procfs,sysfs,netlink。

论坛徽章:
0
4 [报告]
发表于 2009-04-20 15:54 |只看该作者
原帖由 richardhesidu 于 2009-4-20 14:49 发表

类似的问题这里以前讨论过。现成的用户和内核共享内存的方法多通过/dev/mem让用户访问内核地址。
但现在较新的内核默认情况下禁止用户态通过/dev/mem访问内核地址。

至于互斥,没有现成的机制来实现。

...


没错,用共享内存主要考虑的是效率问题。我目前用的是procfs,效率很低。

论坛徽章:
0
5 [报告]
发表于 2009-04-20 16:03 |只看该作者
原帖由 allenlu1212 于 2009-4-20 15:54 发表


没错,用共享内存主要考虑的是效率问题。我目前用的是procfs,效率很低。

试试seqfile啊

论坛徽章:
0
6 [报告]
发表于 2009-04-20 23:18 |只看该作者
要与内核通信最好的方法是netlink。内核态是软终端,效率绝对高。
给你篇文章
http://www.ibm.com/developerworks/cn/linux/l-netlink/index.html

mmap也得通过文件来操作吧。
mmap是文件操作上的一个系统调用,在内核态实现mmap的时候就定义了内存空间的大小。
用户态不需要知道具体大小和位置,只要知道这个文件就行了。

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
7 [报告]
发表于 2009-04-21 03:03 |只看该作者
1) 如何实现对共享内存的互斥访问呢?
不能互斥。kernel只能是通过一个atomic的标志,判断当前能不能访问这段共享内存,并做好如果不能访问的对策。
如果kernel死等标志被清的话,很容易负责清这个标志的用户进程不在运行态,搞的半天不清这个标志。如果UP可抢占或者SMP还好点,最多进程调度表现怪异而已;UP不可抢占的话直接死机。

2)用户空间如何知道共享内存的地址呢,即kernel如何通知user共享内存的地址和大小?
在驱动中,通过mmap实现共享内存。mmap既可以知道共享内存在kernel的地址,也能知道在user中的地址


另外,kernel与user共享内存是一件很麻烦的事,如果是X86还简单,如果是VIVT或者那些set狂多的VIPT的CPU,简直就是搞定一个坑,又是一个坑。

如果是set很多的VIPT的话,可以在bootmem或者buddy中,分配连续的内存,直接让这些内存具有各个color,然后按照color映射到user.
如果是VIVT的话,只有在kernel更改了共享内存的数据后,根据objrmap遍历pte,来反复的drain && invalidate各个user当前的dcache.

评分

参与人数 1可用积分 +30 收起 理由
prolj + 30 就这里吧,说得好

查看全部评分

论坛徽章:
0
8 [报告]
发表于 2009-04-21 11:53 |只看该作者
原帖由 emmoblin 于 2009-4-20 23:18 发表
要与内核通信最好的方法是netlink。内核态是软终端,效率绝对高。
给你篇文章
http://www.ibm.com/developerworks/cn/linux/l-netlink/index.html

mmap也得通过文件来操作吧。
mmap是文件操作上的一个系统 ...


我也是昨天刚看了这篇blog,两个问题:
1. 如果是拿netlink用作互斥机制的话,前面“塑料袋”提出的问题就没办法解决。
2. 如果是拿netlink用作数据传输的话,和共享内存比就没什么优势了。用共享内存就是想0拷贝。

Thanks very much emmoblin!

论坛徽章:
0
9 [报告]
发表于 2009-04-21 14:37 |只看该作者

回复 #8 allenlu1212 的帖子

这里有一篇关于linux零拷贝的文章:
http://www.linuxjournal.com/article/6345

论坛徽章:
0
10 [报告]
发表于 2009-04-24 22:54 |只看该作者
说一下我的想法:
1、共享内存。内核中用sys_mmap,用户中用mmap。
2、互斥用信号量。内核中用sys_semget,用户态用semget。

不知道行不行?

[ 本帖最后由 ddvv 于 2009-4-24 22:58 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP