Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo leer mmap

Cómo leer mmap

mmap asigna archivos u otros objetos a la memoria. Los archivos se asignan a varias páginas y, si el tamaño del archivo no es la suma de todos los tamaños de página, se borrará el espacio no utilizado en la última página. munmap realiza la operación opuesta, eliminando la asignación de objetos para un rango de direcciones específico. Para asignaciones basadas en archivos, el st_atime del archivo asignado se puede actualizar en cualquier momento durante las ejecuciones de mmap y munmap. Si el campo st_atime no se actualiza en el caso anterior, el valor del campo se actualizará la primera vez que se indexe la primera página del área mapeada. El st_ctime y st_mtime de un mapa de archivos creado con los indicadores PROT_WRITE y MAP_SHARED se actualizan después de que se escribe el área asignada, pero antes de que se llame a msync() con los indicadores MS_SYNC y MS_ASYNC.

Uso

#include void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); (void * start, size_t length); Parámetros: inicio: la dirección inicial del área de mapeo. PROT_EXEC // El contenido de la página se puede ejecutar PROT_READ // El contenido de la página se puede leer PROT_WRITE // La página se puede escribir PROT_NONE // No se puede acceder a la página banderas: especifica el tipo de objeto de mapeo, las opciones de mapeo y si la página de mapeo puede ser jodidamente disfrutado. Su valor puede ser una combinación de uno o más de los siguientes bits MAP_FIXED // Utilice la dirección de inicio de mapeo especificada. Si el área de memoria especificada por los parámetros start y len se superpone con un espacio mapeado existente, la superposición se descartará. Si la dirección inicial especificada no está disponible, la operación fallará. La dirección inicial debe estar en el límite de una página. MAP_SHARED // Comparte el espacio de mapeo con todos los demás procesos que mapean este objeto. Escribir en el área compartida *** equivale a enviarlo a un archivo. El archivo no se actualiza realmente hasta que se llama a msync() o munmap(). MAP_PRIVATE // Crea una copia del mapa privado al escribir. Escribir en el área de memoria no afecta el archivo original. Esta etiqueta es mutuamente excluyente con las etiquetas anteriores, solo se puede utilizar una de ellas. MAP_DENYWRITE // Esta bandera será ignorada. MAP_EXECUTABLE // Igual que arriba MAP_NORESERVE // No reserve espacio de intercambio para esta asignación. Cuando se reserva espacio de intercambio, se garantizan modificaciones en el área mapeada. Cuando el espacio de intercambio no está reservado y la memoria es insuficiente, las modificaciones en el área asignada provocarán una señal de infracción de segmento. MAP_LOCKED //Bloquea la página en el área asignada para evitar que la página se cambie sin memoria. MAP_GROWSDOWN // Se utiliza para indicarle al sistema de máquina virtual del kernel en la pila que el área mapeada se puede expandir hacia abajo. MAP_ANONYMOUS // Mapeo anónimo, el área de mapeo no está asociada con ningún archivo. MAP_ANON // Alias ​​de MAP_ANONYMOUS, ya no se utiliza. MAP_FILE // Indicador de compatibilidad, ignorado. MAP_32BIT //Coloque el área de mapeo en los 2 GB inferiores del espacio de direcciones del proceso, ignorado cuando se especifica MAP_FIXED. Actualmente sólo la plataforma x86-64 admite esta bandera. MAP_POPULATE // Prepare tablas de páginas para el mapeo de archivos leyendo con anticipación. El acceso posterior al área mapeada no está bloqueado por violaciones de la página. MAP_NONBLOCK //Solo tiene sentido cuando se usa con MAP_POPULATE. No se realiza ninguna búsqueda previa, solo se crean entradas de la tabla de páginas para las páginas que ya existen en la memoria. fd: Descriptor de archivo válido. Si se establece MAP_ANONYMOUS, el valor debe ser -1 por razones de compatibilidad.

desplazamiento: el punto de partida del contenido del objeto mapeado.

Descripción del valor de retorno

Cuando la ejecución es exitosa, mmap() devuelve un puntero al área mapeada y munmap() devuelve 0. En caso de error, mmap() devuelve MAP_FAILED [que tiene el valor (void *)-1] y munmap devuelve -1. errno se establecerá en uno de los siguientes valores EACCES: Error de acceso EAGAIN: El archivo está bloqueado o hay demasiada memoria bloqueada EBADF: fd no es un descriptor de archivo válido EINVAL: Uno o más argumentos no son válidos ENFILE: Requisitos del sistema para abrir el archivo se han alcanzado las limitaciones ENODEV: El sistema de archivos donde se encuentra el archivo especificado no admite el mapeo de memoria ENOMEM: Sin memoria o el proceso ha excedido la capacidad máxima del mapa de memoria EPOMEM: Sin memoria o el proceso excedió la capacidad máxima del mapa de memoria EPOMEM: Sin memoria, o el proceso excedió la capacidad máxima del mapa de memoria EPOMEM: Sin memoria, o el proceso excedió la capacidad máxima del mapa de memoria Capacidad de mapeo de memoria EPOMEM: Memoria insuficiente, o el proceso excedió la capacidad máxima de mapeo de memoria EPOMEM: Memoria insuficiente o el proceso excedió la capacidad máxima de mapeo de memoria EPOMEM: Memoria insuficiente o el proceso excedió la capacidad máxima de mapeo de memoria EPERM: Batería insuficiente, operación no permitida ETXTBSY: El archivo ha sido se abrió para escritura y se especificó el indicador MAP_DENYWRITE SIGSEGV: se intentó escribir en un área de solo lectura SIGBUS: se intentó acceder a un área de memoria que no pertenece al proceso.