MMAP(2) | Manual del Programador de Linux | MMAP(2) |
mmap, munmap - ubica o elimina ficheros o dispositivos en memoria
#include <sys/mman.h>
caddr_t mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
int munmap(void *start, size_t length);
La función mmap intenta ubicar length bytes comenzando en el desplazamiento offset desde el fichero (u otro objeto) especificado por el descriptor de fichero fd en memoria, preferiblemente en la dirección start. Esta última dirección es una sugerencia y normalmente se especifica como 0. El lugar donde es ubicado el objeto es devuelto por mmap, y nunca vale 0. El argumento prot describe la protección de memoria deseada. (y no debe entrar en conflicto con el modo de apertura del fichero). Puede valer PROT_NONE o ser la combinación mediante la operación OR de una o más de las otras banderas PROT_*.
El parámetro flags especifica el tipo de objeto insertado, las opciones de asociación y si las modificaciones hechas a la copia insertada en memoria son privadas al proceso o son compartidas por otras referencias. Tiene los bits:
Debe especificarse exactamente uno de los parámetros MAP_SHARED o MAP_PRIVATE.
Los tres parámetros anteriores están descritos en POSIX.1b (formalmente POSIX.4) y Linux también reconoce los siguientes parámetros no estándares:
Algunos sistemas documentan los parámetros adicionales MAP_AUTOGROW, MAP_AUTORESRV, MAP_COPY, y MAP_LOCAL.
fd debe ser un descriptor de fichero válido, a menos que MAP_ANONYMOUS esté activo, en cuyo caso el argumento es ignorado.
offset debe ser un múltiplo del tamaño de página como lo devuelve getpagesize(2).
La memoria asociada con mmap es conservada después de fork(2), con los mismos atributos.
Un fichero es ubicado en múltiplos del tamaño de página. Para un fichero que no sea múltiplo del tamaño de página, la memoria restante es puesta a cero cuando se ubica, y las escrituras a esa región no son llevadas al fichero. El efecto de cambiar el tamaño del fichero subyacente a una correspondencia en aquellas páginas que correspondan a regiones añadidas o eliminadas del fichero es indefinido.
La llamada al sistema munmap borra las ubicaciones para el rango de direcciones especificado, y produce referencias a las direcciones dentro del rango a fin de generar referencias a memoria inválidas. La región es también desubicada automáticamente cuando el proceso termina. Por otra parte, cerrar el descriptor de fichero no desubica la región.
La dirección start debe ser un múltiplo del tamaño de página. Todas las páginas que contengan una parte del rango indicado son desubicadas, y referencias posteriores a estas páginas generarán una violación de segmento. No se considera un error si el rango indicado no contiene páginas con correspondencia.
Para correspondencias respaldadas por fichero, el campo st_atime para el fichero ubicado puede ser actualizado en cualquier instante entre la llamada mmap() y la desubicación correspondiente; la primera referencia a una página con correspondencia actualizará el campo si no lo ha sido ya.
Los campos st_ctime y st_mtime para un fichero ubicado con PROT_WRITE y MAP_SHARED serán actualizados después de una escritura a la región ubicada, y antes de una llamada posterior a msync() con la opción MS_SYNC o MS_ASYNC, si alguna procede.
Si ha funcionado mmap devuelve un puntero al área reservada. En caso de error, es devuelto -1, y errno es modificado apropiadamente. Si ha funcionado munmap devuelve 0, si hay error -1, y errno es fijada (probablemente a EINVAL).
Es dependiente de la arquitectura si PROT_READ incluye a PROT_EXEC o no. Los programas portables deberían siempre activar PROT_EXEC si intentan ejecutar código en la nueva región ubicada.
El uso de una región ubicada puede resultar en estas señales:
SVr4, POSIX.1b (formalmente POSIX.4), 4.4BSD, SUSv2. SVr4 documenta los códigos de error ENXIO y ENODEV. SUSv2 documenta ls códigos de error adicionales EMFILE y EOVERFLOW.
MAP_32BIT es una extensión de Linux.
getpagesize(2), mmap2(2), mremap(2), msync(2), shm_open(2), B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128-129 and 389-391.
25 marzo 2000 | Linux 2.3.51 |