免费注册 查看新帖 |

Chinaunix

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

[内存管理] 请教大家一个mmap的问题。 [复制链接]

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-02 21:19 |只看该作者 |倒序浏览
在C++版也发了,但是好像我觉得发在这个版更合适些。

代码大概如下:

int page_size = sysconf(_SC_PAGESIZE);    //4096
int fd = open("mem", O_CREAT | O_RDWR | O_TRUNC, 0777);
lseek(fd, page_size + 99, SEEK_SET)//file_size = 4196
write(fd, &c, sizeof(char));
char *pmap = (char *)mmap(NULL, page_size * 3, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
pmap[page_size * 3 + 4096] = 'x';
printf("pmap = %c.\n", pmap[page_size * 3 + 4096]);//可以输出x

我想问的是:
1、mmap的第二个参数length和文件大小(长度)有没有什么必然联系?我这里生成文件大小为4196字节。但是映射的是4096*3这么大,也没见报错?
2、而且我直接访问pmap[page_size * 3 + 4096],已经超出映射内存的大小了,也没有收到bus error 或者SIGSEV?这是什么原因呢?

谢谢。

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
2 [报告]
发表于 2012-07-03 13:40 |只看该作者

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
3 [报告]
发表于 2012-07-03 20:48 |只看该作者
高手们都到哪里去啦。。。

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-02-05 20:34:47
4 [报告]
发表于 2012-07-05 08:50 |只看该作者
都没人来这个版块了啊...

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
5 [报告]
发表于 2012-07-05 09:31 |只看该作者
回复 1# sublx

> 1、mmap的第二个参数length和文件大小(长度)有没有什么必然联系?我这里生成文件大小为4196字节。但是映射的是4096*3这么大,也没见报错?

刚看了一下源码,这个len是指进程的线性地址空间中的大小,而不是文件的大小
所以这里没有什么问题

论坛徽章:
1
天蝎座
日期:2013-10-23 21:11:03
6 [报告]
发表于 2012-07-05 10:50 |只看该作者
回复 1# sublx


    > 2、而且我直接访问pmap[page_size * 3 + 4096],已经超出映射内存的大小了,也没有收到bus error 或者SIGSEV?这是什么原因呢?

     你的内核版本是多少?我使用glibc + 3.5.0-rc4 kernel跑这段代码会有Segmentation fault (core dumped)
     gdb跟了一下,Program received signal SIGSEGV, Segmentation fault.

论坛徽章:
0
7 [报告]
发表于 2012-07-05 12:37 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP