2012-08-22 11 views
11

Zastanawiam się, dlaczego rozmiar zmapowanej pamięci był jednym parametrem przekazywanym, ponieważ nie mogło być więcej niż jedno mapowanie zaczynające się od tego samego adresu (czyż nie?), Dlaczego jądro Linux nie będzie rejestrować zarówno adresu początkowego, razem, ale niech program przestrzeni użytkownika je zapamięta.Dlaczego munmap potrzebuje długości jako parametru?

To znaczy, dlaczego by tak nie było, po prostu użyj adresu początkowego jako klucza podstawowego do przechowywania drzewa informacji.

Odpowiedz

9

Jeden może map, powiedzmy, 5 stron i później unmap jeden z nich. Informacje o tym, które strony mają być odwzorowywane, są przekazywane jako adres i długość, gdzie długość jest wielokrotnością rozmiaru strony.

6

Możesz munmap podzakres adresów pamięci, które wcześniej zmapowałeś. Na przykład:

#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]); 
}