您尚未登录。

#1 2015-11-15 17:54:54

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

mmap匿名映射好像不成功啊

#include <sys/mman.h>
#include <stdio.h>
int main(){
    void *p1 = mmap(NULL, 23, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_ANONYMOUS, -1, 0);
    void *p2 = mmap(NULL, 45, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_ANONYMOUS, -1, 0);
    printf("p1=%p, p2=%p\n", p1, p2);
    munmap(p1, 23);
    //*((int *)p2)=34;

}

为啥p1,p2全是0xFFFFFFFFFFFFFFFF呢?感觉man文档说的不是很清楚啊,这个映射是得到的地址一定是页边界么?


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#2 2015-11-15 18:24:13

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,953
个人网站

Re: mmap匿名映射好像不成功啊

不一定。出错的时候它还返回 -1,就是你看到的这样子。用 perror 可以看到报错是「Invalid argument」。

文档里是这样解释的:

mmap(2) 说:

EINVAL flags contained neither MAP_PRIVATE or MAP_SHARED, or contained both of these values.

离线

#3 2015-11-15 18:42:30

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: mmap匿名映射好像不成功啊

依云 说:

不一定。出错的时候它还返回 -1,就是你看到的这样子。

但是究竟为什么出错啊?我有好多不清楚啊。
它munmap的时候是包含参数区间的整页都撤掉么?那有些动态库也是这样映射的啊,我传它们的地址进去岂不是lib也被撤掉了。而且内核怎么知道我用了页中的哪些部分,它怎么保证我下次继续mmap的时候不会返回上次用了的地址。


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

#4 2015-11-15 19:03:51

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,953
个人网站

Re: mmap匿名映射好像不成功啊

文档不是解释了为什么会出错么……

离线

#5 2015-11-15 19:50:53

xtricman
エクス·トリクマン
注册时间: 2012-12-26
帖子: 1,267

Re: mmap匿名映射好像不成功啊

依云 说:

文档不是解释了为什么会出错么……

我再看了一下文档,试验了一下,它只能按页映射按页撤销,匿名映射的长度是没有用的,只是超过一页的长度的话就会多分一页出来,不足一页下次也分一页,不撤销下次就用不了。映射完了之后整页都是能访问的。


反社会,精神极其不稳定,随时可能炸碎身边所有人

离线

页脚