2012-08-22 13 views
11

Mi stavo chiedendo, perché la dimensione della memoria mappata doveva essere passata in un parametro, dal momento che non potevano esserci più di una mappatura a partire dallo stesso indirizzo (vero?), Perché il kernel di Linux non registra sia l'indirizzo iniziale, lunghezza insieme, ma lascia che il programma userspace li ricordi.Perché munmap ha bisogno di una lunghezza come parametro?

Voglio dire, perché non lo sarebbe, basta usare l'indirizzo iniziale come chiave primaria per memorizzare l'albero delle informazioni.

risposta

9

Uno può map, ad esempio, 5 pagine e successivo unmap uno di loro. E le informazioni su quali pagine da rimuovere vengono passate come indirizzo e lunghezza dove la lunghezza è un multiplo della dimensione della pagina.

6

È possibile munmap un subrange di indirizzi di memoria precedentemente mappati. Ad esempio:

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