为什么munmap需要长度作为参数?

时间:2012-08-22 15:17:45

标签: linux kernel mmap

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

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

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:6)

您可以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]);
}