免费注册 查看新帖 |

Chinaunix

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

求助:用户态多线程共享内核内存疑问! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-10 12:02 |只看该作者 |倒序浏览
目的:我希望在内核态(内核模块)创建一片内存区,然后与用户态的多个线程共享这片内存区。

进展:
内核态:在内核模块当中已经通过定义 file_operations 结构体函数的方式定义了open,close和mmap函数,并通过mknode 在/dev下创建了一个虚拟设备;
用户态:在用户态open这个虚拟设备,通过mmap系统调用对这个文件句柄fd进行内存映射,把内核态分配的内存区映射到用户态,已经实现了一个用户态线程与内核态进行内存共享。但是另外一个线程试图去mapp这个相同的文件句柄fd时,则挂死,不返回。

问题:我有几百个这样的线程,不可能每个线程都打开虚拟设备一次。这样会浪费很多文件句柄。我该如何处理?大家能否帮帮我?

论坛徽章:
0
2 [报告]
发表于 2008-01-10 13:17 |只看该作者
线程默认是共享文件和内存的,没有必要都mmap一次

论坛徽章:
0
3 [报告]
发表于 2008-01-10 14:00 |只看该作者
多谢flw2 答复。
但是如果第二个线程直接使用第一个线程mmap后的地址,会出现segment fault。

论坛徽章:
0
4 [报告]
发表于 2008-01-10 14:34 |只看该作者
每个线程有自己的页表,我在虚拟设备当中通过调用 remap_page_range来把mmap获取到的线性区映射到物理内存上。但是仅仅修改当前进程的页表,没有修改其他线程的页表,因此其他线程使用第一个线程mmap出来的线性地址会报 segment fault.

论坛徽章:
0
5 [报告]
发表于 2008-01-10 14:48 |只看该作者
问题解决,原来是我理解有误,所有线程共享地址空间。原来的segment fault是由于其他原因。谢谢flw2 提醒。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP