2012-08-22 21 views
11

Me preguntaba, ¿por qué el tamaño de la memoria mapeada es un parámetro pasado, ya que no podría haber más de un mapeo comenzando desde la misma dirección (¿podrían?), ¿Por qué el núcleo de Linux no registrará ambas direcciones de inicio, longitud juntos, pero permita que el programa de espacio de usuario los recuerde.¿Por qué munmap necesita una longitud como parámetro?

Quiero decir, ¿por qué no sería así, simplemente use la dirección de inicio como clave principal para almacenar el árbol de información.

Respuesta

9

Uno puede map, por ejemplo, 5 páginas y más tarde unmap uno de ellos. Y la información sobre qué páginas desasignar se pasa como dirección y longitud, donde la longitud es un múltiplo de tamaño de página.

6

Usted puede munmap un subintervalo de direcciones de memoria que ha asignado previamente. Por ejemplo:

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