2012-01-26 20 views
5

Así que estaba jugando con el depurador Olly, olfateando lo que todavía puedo averiguar sobre Windows y presioné ese botón M y apareció esa ventana de mapa de memoria. Así que busqué en Google algunos artículos sobre el tema y descubrí que realmente puedo escribir en direcciones superiores a 64K, lo cual intenté y bien ... ¿por qué no funcionaría? Acerca de esos 2GB de espacio más bajo:diseño de memoria de proceso de Windows

  • ¿Por qué hay esas lagunas? Por ejemplo, hay 0x10000-0x1FFFF R/espacio Wable, entonces no hay 128K nada y, a continuación, un poco de espacio legible. Me refiero a que esto ya está paginado, así que no debería importar si había algo en el pasado como en el espacio físico (sin mencionar que 0x20000-0x40000 debería estar bien para todos), ¿por qué alguien decidiría no hacerlo? usar algún espacio de direcciones tan al azar? Es muy probable que esté confundido porque en ese mapa de memoria del depurador olly, muchas líneas quedan sin espacio donde la columna dice "contiene". ¿Hay alguna referencia que podría poner en este mapa de memoria de olly y descubrir qué espacio tiene qué propósito y, por lo tanto, está o no está paginado de esta manera?

  • Supongamos que realmente no metería la pata en la gestión de la memoria, ¿está bien escribir programas para Windows que usen esa memoria más baja en lugar de utilizar el montón o podría surgir algún problema?

Gracias por leer esta pregunta.

EDITAR

Ah here vamos con lo que está en 0x10000 y que también es probablemente la razón de que la página se dejó que se puede escribir.

+1

estudiar en OS :) – Adrian

+0

Bueno ... eso es lo que estoy tratando de hacer con esto :) – Pyjong

+0

con respecto a su última pregunta ... Dudo que podría escribir en la memoria protegida. Su ubicación depende del sistema operativo. Así que lea más sobre cómo hacer un sistema operativo, luego lea cómo gestiona Windows su memoria (supongo que ganó desde que mencionó a Olly) – Adrian

Respuesta

1

No todas las memorias están disponibles para el uso de las aplicaciones. Por ejemplo, algunos tipos de hardware requieren memoria para que el sistema (BIOS u OS) asigne un bloque de memoria física y lo deje para que el hardware se administre solo. Esa memoria puede no ser directamente legible (o escribible) porque la realización de tales operaciones afectaría el hardware. El hardware mismo puede tener sus propias restricciones sobre qué rangos de memoria puede usar.

Si está en Windows, no puede ir a escribir a ubicaciones de memoria arbitrarias: el sistema operativo no le permitirá (al menos en modo de usuario) y habrá paginado la memoria de todos modos, por lo que la dirección que cree que ' volver a mirar (la dirección virtual) no coincidirá con la real dirección de memoria física.

En general, solo debe leer y escribir en la memoria que el sistema operativo le haya solicitado y asignado.

+0

Sí, probablemente es la memoria paginada y es por eso que no entiendo por qué es el mapa así en lugar de un bloque continuo de memoria virtual. – Pyjong

+0

@stupid_idiot quizás fragmentación; tal vez MS decidió hacerlo así en su algoritmo – Adrian

3

Parece que no tiene una pregunta centrada, por lo que es difícil proporcionar una respuesta valiosa. Sin embargo, parece implicar la pregunta ¿Cómo mapea la memoria del espacio de usuario de Windows?

En primer lugar, el espacio de memoria virtual baja — de cero a 64 K o más — queda sin asignar para atrapar a base de NULL desreferencia puntero. Estos son errores de programación comunes de los cuales queremos saber de inmediato. El programa casi seguramente debería terminar si ocurre uno. Al dejar este espacio sin asignar, se produce el equivalente a SEGFAULT de Windows. Muy útil.

Normalmente, el código y el espacio constante se asignan a continuación. Una vez que un programa ha comenzado a ejecutarse, generalmente no hay necesidad de que este espacio cambie, por lo que se configura como de solo lectura, y algunas partes se marcan como ejecutables —, generalmente la primera parte, que puede ser el 99% del espacio.Si hay bibliotecas de códigos compartidos, estas se asignan después del código principal (normalmente), a menudo con espacios pequeños para que el segmento de código de la biblioteca esté alineado con la página (quizás 4K, quizás 64K o más) para un uso eficiente del registro de administración de memoria. Rara vez es necesario conservar el espacio de la memoria virtual.

Después de eso es el espacio de datos. Eso puede ser memoria inicializada o no inicializada. Todo tiene que ser de lectura y escritura. Y necesita tener espacio reservado arriba para que pueda crecer y crecer en el montón.

Muy por encima del espacio de datos es el espacio de la pila. Tiene que ser de lectura-escritura y tener espacio debajo de para que pueda crecer. Todas las pilas de CPU modernas crecen hacia la memoria baja.

Y encima de la pila está el espacio del sistema.

Si el proceso solicita acceso a la memoria compartida (con otros procesos), el tamaño de la ventana asignada dicta dónde puede caber en el mapa de memoria. Mapear demasiado cerca de donde crece el montón es un problema, y ​​demasiado cerca del crecimiento potencial de la pila también es un problema. Afortunadamente, los algoritmos de colocación bastante simples resuelven esto para la gran mayoría de los programas. Solo piensa en las diversas necesidades y probablemente puedas descubrir por qué el sistema operativo hace lo que hace.

Cuestiones relacionadas