页次: 1
#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文档说的不是很清楚啊,这个映射是得到的地址一定是页边界么?
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
不一定。出错的时候它还返回 -1,就是你看到的这样子。用 perror 可以看到报错是「Invalid argument」。
文档里是这样解释的:
EINVAL flags contained neither MAP_PRIVATE or MAP_SHARED, or contained both of these values.
离线
不一定。出错的时候它还返回 -1,就是你看到的这样子。
但是究竟为什么出错啊?我有好多不清楚啊。
它munmap的时候是包含参数区间的整页都撤掉么?那有些动态库也是这样映射的啊,我传它们的地址进去岂不是lib也被撤掉了。而且内核怎么知道我用了页中的哪些部分,它怎么保证我下次继续mmap的时候不会返回上次用了的地址。
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
文档不是解释了为什么会出错么……
离线
文档不是解释了为什么会出错么……
我再看了一下文档,试验了一下,它只能按页映射按页撤销,匿名映射的长度是没有用的,只是超过一页的长度的话就会多分一页出来,不足一页下次也分一页,不撤销下次就用不了。映射完了之后整页都是能访问的。
反社会,精神极其不稳定,随时可能炸碎身边所有人
离线
页次: 1