¿Qué hace esta línea de código?
mmap(NULL, n, PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
c y f
Solicita un mapeo anónimo privado y escribible de n
bytes de memoria.
- Una asignación privada significa que no se comparte con otros procesos (p. ej., después de una
fork()
el niño y el padre tendrán asignaciones independientes); - Una asignación anónima significa que no está respaldada por un archivo.
En este caso, se trata esencialmente de solicitar un bloque de n
bytes de memoria, tan aproximadamente equivalente a malloc(n)
(aunque hay que liberarlo con munmap()
en vez de free()
, y estará alineado con la página). También solicita que se pueda escribir en la memoria, pero no que se pueda leer; sin embargo, la memoria que se puede escribir y la que no se puede leer generalmente no es una combinación compatible con el hardware subyacente. Cuando PROT_WRITE
solo se solicita, POSIX permite que la implementación suministre memoria que también se puede leer y/o ejecutar.
-
En x86 PROT_WRITE implica PROT_READ y POSIX lo permite.
– Iwillnotexist Idonotexist
1 de mayo de 2019 a las 1:27
Richard Fearn
man mmap
te ayudará aquí.
Crea un mapeo de memoria en el espacio de direcciones virtuales del proceso. está creando un anónimo mapeo, que es más bien como usar malloc
ubicar n
bytes de memoria.
Los parámetros son:
NULL
– el núcleo elegirá una dirección para el mapeon
– longitud del mapeo (en bytes)PROT_WRITE
– se pueden escribir páginasMAP_ANON | MAP_PRIVATE
– la asignación no está respaldada por un archivo y las actualizaciones escritas en la asignación son privadas para el proceso-1
– el descriptor del archivo; no se usa porque la asignación no está respaldada por un archivo0
– desplazamiento dentro del archivo en el que iniciar la asignación – de nuevo, no se usa, porque la asignación no está respaldada por un archivo