2011-09-07 11 views
6

Me enfrenta a un problema bastante complicado. Estoy tratando de obtener 2 áreas de memoria virtual apuntando a la misma memoria física. El punto es tener diferentes parámetros de protección de página en diferentes áreas de memoria.¿Cómo asignar dos direcciones virtuales en la misma memoria física en Linux?

En este foro, el usuario parece tener una solución, pero parece un poco hacky y es bastante claro que algo mejor se puede hacer en cuanto al rendimiento: http://www.linuxforums.org/forum/programming-scripting/19491-map-two-virtual-memory-addres-same-physical-page.html

Como estoy enfrentando el mismo problema, Quiero dar una oportunidad aquí para saber si alguien tiene una mejor idea. No tengas miedo de mencionar los detalles sucios detrás del capó, de eso se trata esta pregunta.

Gracias por adelantado.

Respuesta

3

Estoy tratando de obtener 2 áreas de memoria virtual apuntando en la misma memoria física.

mmap la misma región en el mismo archivo, dos veces, o utilizar System V shared memory (que no requiere la asignación de un archivo en la memoria).

+0

Esto es aún peor. Si se especifica MAP_SHARED, se requerirá IO y si se establece MAP_PRIVATE, la copia en escritura hará que el truco se vuelva inoperante. La solución tiene el mismo inconveniente que la solución propuesta en el hilo: este proceso de memoria compartida a través de una forma no controlada. – deadalnix

+0

@deadalnix: se agregó una nota sobre System V SHM. Hay, AFAIK, otras formas de hacerlo en el espacio de usuario. –

+0

@larsmars> sí Las llamadas System V son lo que se sugiere en el enlace. Esto está funcionando, pero la memoria podría ser enganchada con bastante facilidad por otro proceso, lo cual es problemático para la seguridad. – deadalnix

3

Supongo que si no te gusta Sys V memrory compartida puedes usar POSIX shared memory objects. No son muy populares, pero están disponibles en Linux y BSD al menos.

Una vez que obtenga un fd con shm_open puede llamar inmediatamente al shm_unlink. Entonces, ningún otro proceso puede conectarse a la misma memoria compartida, y usted puede mmap varias veces. Todavía hay un pequeño período de carrera disponible.

+0

Jaja, no es que no me guste el SysV. Lo que no me gusta es habilitar el intercambio de memoria para lograr algo que no tiene nada que ver con eso. – deadalnix

1

Si usted es root, puede mmap("/dev/mem", ...) pero hay advertencias en los núcleos más recientes, ver accessing mmaped /dev/mem?

Cuestiones relacionadas