免费注册 查看新帖 |

Chinaunix

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

[内核入门] mmap(),求大神拯救我! [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-05-13 11:00 |只看该作者 |倒序浏览

  1. fd1 = open(/dev/mem文件);
  2. p1 = mmap(fd1, 0偏移, 200长度);
  3. p11 = mmap(fd1, 0偏移, 100长度);
  4. p12 = mmap(fd1, 100偏移, 100长度);

  5. fd2 = open(/dev/mem文件);
  6. p2 = mmap(fd2, 0偏移, 200长度);
  7. p21 = mmap(fd2, 0偏移, 100长度);
  8. p22 = mmap(fd2, 100偏移, 100长度);
复制代码


目标:同一个进程中。修改p11、p12指向的区域,通过p1可以看见,p2看不见;修改p21、p22指向的区域,通过p1看不见,p2可以看见;
p1、p11、p12关联的文件描述符为fd1;p2、p21、p22关联的文件描述符为fd2,但它们在/dev/mem中映射的区间相同,导致目标不能实现。

① 将映射的文件偏移错开,但我需要映射很多这样的区间,很容易会不够
② 映射到不同的真实文件,但那样磁盘会受不了

我想请教大神们的是:有什么其它方法可以实现我的需求?

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
2 [报告]
发表于 2017-05-15 13:42 |只看该作者
看看是不是 mmap 的这个 prot 参数的设置问题:
  1. man mmap
  2. ...
  3.        MAP_SHARED Share  this  mapping.  Updates to the mapping are visible to other processes that map this file, and are carried through to the underlying file.  The
  4.                   file may not actually be updated until msync(2) or munmap() is called.

  5.        MAP_PRIVATE
  6.                   Create a private copy-on-write mapping.  Updates to the mapping are not visible to other processes mapping the same file, and are not carried through
  7.                   to the underlying file.  It is unspecified whether changes made to the file after the mmap() call are visible in the mapped region.
  8. ...
复制代码

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
3 [报告]
发表于 2017-05-15 20:28 |只看该作者
回复 2# amarant

但是p1、p11、p12,p2、p21、p22都是在一个进程里。具体应用场景是,每个http、ftp连接,如果事先不知道有多少数据要保存,我就4k4k的保存,把他们链起来,但这样不连续的保存,不方便分析,笨方法是先复制到一块连续内存,再分析,但那样效率不行,我就想能不能只分配一块连续的虚拟内存,然后4k4k的映射进来,就可以按照连续内处理了

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
4 [报告]
发表于 2017-05-16 08:13 |只看该作者
回复 3# _nosay

你试试 SHARE 的这个参数吧。具体的你可以读读 kernel 代码。我也记不清了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP