12

我想知道,为什么映射内存的大小应该是一个传入的参数,因为从同一个地址开始的映射不能超过一个(可以吗?),为什么 linux 内核不会同时记录起始地址和长度,但让用户空间程序记住它们。

我的意思是,为什么不呢,只是使用起始地址作为主键来存储信息树。

4

2 回答 2

10

一个可以map,比如说,5 页,然后unmap是其中的一页。并且有关要取消映射的页面的信息作为地址和长度传递,其中长度是页面大小的倍数。

于 2012-08-22T15:28:06.873 回答
7

您可以munmap使用之前映射的内存地址子范围。例如:

#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>

int main()
{
    int pagesize = sysconf(_SC_PAGESIZE);
    char *addr = mmap(NULL, 4 * pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    addr[pagesize] = 'X';
    munmap(addr, pagesize);

    printf("%c\n", addr[pagesize]);
}
于 2012-08-22T15:31:20.667 回答