Teóricamente, si tuviera que construir un programa que asignara toda la memoria no utilizada en un sistema y continuara solicitando más y más memoria a medida que otras aplicaciones liberan memoria que ya no necesitan, ¿sería posible leer la memoria recientemente liberada de otras aplicaciones? ? ¿O está de alguna manera protegido por el sistema operativo moderno?
No tengo una aplicación práctica para esto, solo tengo curiosidad. Me doy cuenta de que hay algunos problemas con la asignación de "toda la memoria disponible" en la vida real.
Editar: para aclarar, estoy preguntando específicamente sobre la memoria "Liberada", no para acceder a la memoria que actualmente está asignada por otra aplicación.
fuente
The reason you don't always see zeroed out memory is because it is more efficient not to zero out the memory if it was previously allocated by the same process
Veo algunas inconsistencias aquí. ¿Quiso decir "mismo ejecutable"? ¿Cómo se verifica si la ruta del disco no se pone a cero?Aquí hay varias capas involucradas que afectan la respuesta.
Si asume un sistema operativo de memoria virtual moderno, no podrá ver los restos de los datos de otros procesos en las páginas que asigne.
Cuando se carga un proceso por primera vez, se carga la tabla de páginas y potencialmente se asignan marcos de memoria real a esas páginas. Como mínimo, la tabla de páginas o su tabla complementaria contendrá un mapa de toda la memoria que el proceso puede asignar. Aquí también se establece la interrupción inicial del proceso, mencionada anteriormente.
Si bien malloc () puede, si se permite el proceso, hacer que cambie el salto del proceso, agregando más páginas a una tabla de página de procesos (página suplementaria) para satisfacer la solicitud, el lugar donde un proceso puede "obtener otro" datos de procesos es La capa de memoria real inferior.
En ambos escenarios, un sistema operativo moderno que utiliza paginación de demanda o asignación diferida, todavía no está asignando memoria física (marcos). El sistema operativo simplemente "toma notas" sobre qué memoria virtual para ese proceso se considera válida. La memoria real se asigna solo cuando es necesario.
La memoria física o los marcos se asignan a un proceso cuando la página virtual se realiza y se mapea en una tabla de página de procesos Aquí es donde existe el potencial de exposición de datos. Esto sucede durante un fallo de página. La exposición se debe a que un proceso anterior puede haber estado usando ese mismo marco y sus datos fueron abandonados o intercambiados, para dejar espacio para la solicitud de memoria física actual. El sistema operativo debe tener cuidado para garantizar que los datos de los procesos solicitantes se intercambien correctamente o que el marco se borre (ponga a cero) antes de reanudar el proceso. Esto también se menciona anteriormente como un problema "antiguo pero resuelto".
Esto hace que sea algo irrelevante si la memoria de otros procesos fue "liberada" o no. La memoria "liberada" de otros procesos aún reside en las páginas asignadas a ese proceso y, por lo general, no se asignan hasta que finaliza el proceso, ya que simplemente se intercambiarán cuando la memoria sea baja o se desalojen de otro modo. malloc () y free () administran la memoria virtual asignada al proceso en el nivel (usuario).
En su pregunta, su proceso, continúa solicitando más y más memoria, en teoría, eliminando todos los demás procesos de la memoria. En realidad, existen estrategias de asignación de marcos, globales y locales, que también pueden afectar la respuesta. Es muy probable que el proceso obligue a sus propias páginas a quedarse sin memoria antes de permitir que se sobrepase el sistema operativo y todos los demás procesos. Aunque esto va más allá de tu pregunta inicial.
Todo esto es discutible en un sistema como MS-DOS. MS-DOS (y otros sistemas más simples) no usan memoria virtual (por sí mismos) y usted podría fácilmente pinchar y pinchar en otros datos de "procesos".
Algunas buenas referencias, que pueden ser más fáciles de entender que el código fuente de Linux, serían un buen libro de texto de sistemas operativos, Conceptos de sistemas operativos de Silberscatz, Gavin y Gange, o Diseño de sistemas operativos de Andrew Tanenbaum. También algo como Nachos de Berkeley o Pintos de Stanford son pequeños sistemas operativos creados para el aprendizaje y tienen estas mismas ideas dentro de ellos.
fuente
Probé esto en Ubuntu hace 16.04 meses. Tal como dijo 0xACE, el sistema operativo moderno asigna una página virtual completa a cero una vez que llamó a malloc (). Pero, si no escribe nada en el búfer asignado, no se asignará a la memoria física (es decir, principio de copia en escritura), por lo que siempre leerá ceros desde un bloque "no inicializado". Tal vez hay un sistema operativo integrado compilado con la opción "CONFIG_MMAP_ALLOW_UNITIALIZED" para un mejor rendimiento, en este caso, podría obtener lo que expiró.
fuente
No, esto no permitirá que otro programa lea la memoria de otro gracias a la magia de la paginación . De esta forma, el uso total de la memoria puede exceder el RAM físico descargando partes del mismo en el disco duro.
Además, la memoria máxima que un proceso puede asignar está limitada arbitrariamente por el sistema operativo (hasta 4 gigas para una arquitectura de 32 bits) después de lo cual la próxima
alloc
llamada devolverá un error de memoria insuficiente.fuente
mlock
).