Почему munmap требует длины в качестве параметра?

Мне было интересно, почему размер передаваемой памяти является одним параметром, так как не может быть больше одного сопоставления, начинающегося с того же адреса (могут ли они?), почему ядро ​​Linux не запустит как начальный адрес, длина вместе, но пусть программа userspace запоминает их.

Я имею в виду, почему бы и нет, просто используйте начальный адрес в качестве первичного ключа для хранения информационного дерева.

Ответ 1

Можно map, скажем, 5 страниц, а затем unmap один из них. И информация о том, какие страницы для unmap передаются как адрес и длина, где длина кратна размеру страницы.

Ответ 2

Вы можете 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]);
}