2011-12-14 15 views
13

Digamos que asigno una memoria grande (40MB) con mmap usando/dev/zero de la siguiente manera.mmap con/dev/zero

fd = open("/dev/zero", O_RDWR); 
a = mmap (0, 4096e4, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FILE, fd, 0); 

Lo que entiendo es que el kernel se inicializará recuerdos a cero a medida que las páginas se ponen en la memoria física (supongo que los modernos núcleos de Linux utilizan paginación demanda). Entonces, por ejemplo, cuando se toca la primera página y, por lo tanto, se lleva a la memoria física, el kernel inicializará todos sus 4096 bytes a cero, y luego cuando se toque la segunda página, hará lo mismo, y así sucesivamente.

¿Es correcto mi entendimiento?

+2

Respuesta corta: Sí – hirschhornsalz

+0

Siempre que toque significa escribir, sí. De lo contrario, si acaba de leer de una página cero, en realidad hay una sola página cero, que será COW'ed en la primera escritura. – ninjalj

+0

Esto fallará mucho en Android 5.0, porque SELinux bloqueará tales rarezas. Es por eso que Inkscape en chroot no se inicia en Android. – pelya

Respuesta

11

Sí, aún más las páginas solo aparecen cuando las toca por primera vez.

Por cierto, existe la bandera MAP_ANONYMOUS que puede utilizar en esta situación, no es necesario abrir un descriptor de archivo en /dev/null.

+0

¿MAP_ANONYMOUS también hace que la memoria 0? ¿Qué sucede si no quiero que la memoria sea cero, para evitar que la sobrecarga de inicializar las memorias sea cero? ¿Qué debería usar entonces? – MetallicPriest

+6

@MetallicPriest Nada. Cualquier memoria no respaldada por archivos sin inicializar que es una posible pérdida del contenido de la memoria de algún otro proceso o del kernel. – ephemient

+3

Use/dev/urandom en lugar de/dev/zero si no desea que el espacio se llene con ceros? :) El kernel no tiene nada que ofrecerle memoria que podría contener restos del programa de otra persona que se ejecuta en la misma memoria: es un riesgo de seguridad. –