2010-03-11 32 views
8

SO: Windows 7 32bitmontón y pila de ensamblaje de Windows?

Por lo tanto, en C++ uno tiene un montón y una pila. Pero he estado empezando a aprender ensamblaje últimamente y no he visto nada por el estilo, solo una pila, pero parece pura memoria. Entonces, ¿la implementación de pila y pila es específica para C++ y otros lenguajes? ¿O todavía te asignan un montón y la pila en el montaje? Al iniciar un ejecutable, ¿qué hace Windows en términos de asignación de memoria para el proceso? ¿Y cómo sabe un proceso qué tan grande debe ser el tamaño de la pila?

¿Cuál es el ir

EDIT: Tal vez alguien podría proveedor de un enlace en la forma del montón y la pila de la memoria es manejada por un proceso por la CPU/OS

Respuesta

9

La pila se mantiene principalmente por la CPU (comandos PUSH/POP/CALL/RET); el montón es puramente una característica de biblioteca OS/run-time. Por lo tanto, el acceso a la pila es natural en el ensamblaje. Para el acceso al montón, simplemente llame a las API relevantes desde su código de ensamblado (HeapAlloc/HeapFree, o desde alguna otra biblioteca). A diferencia de la pila, no hay primitivas de bajo nivel en el lenguaje ensamblador para la gestión de la memoria de pila.

No tiene que preocuparse por el tamaño de la pila en Windows. A medida que consumas más y más, crecerá de forma transparente. En términos de bajo nivel, Windows configura una página de memoria de guardia debajo del fondo de la pila (suponiendo que la pila se reduzca). Cuando su pila llega a la página de protección, se genera una excepción de violación de acceso en la CPU. El kernel de Windows lo atrapará, notará la situación y hará crecer la pila.

+0

Gracias por la información, pero plantea más preguntas xD!¿Cómo sabe Windows dónde ubicar el montón y la pila en la RAM sin procesar para que no se solape o entre en conflicto con otros procesos? ¿Especialmente si cambia dinámicamente de tamaño? – Daniel

+0

@Daniel: otros procesos, un sistema operativo usa memoria virtual. Cada proceso ve su propia vista de la memoria (el espacio de direcciones virtuales). Y sí, el procesador tiene un mecanismo para convertir una dirección virtual a una dirección física. Ver http://en.wikipedia.org/wiki/Virtual_memory – Bahbar

11

mayor parte de mi conocimiento no está en Windows específico, por lo tenga paciencia conmigo:

El montón y la pila se refieren a diferentes áreas en la memoria (pero todavía estamos hablando de la memoria principal en cada caso). Esto no es particular a ningún idioma. El montón vive en las direcciones de memoria baja y crece hacia arriba; la pila vive en las direcciones de memoria alta y crece hacia abajo. Esto es para evitar que se superpongan (lo cual sería muy malo).

En una arquitectura de 32 bits, los registros EBP y ESP hacen un seguimiento del marco de pila actual. EBP es el puntero base: esto apunta a la dirección alta del marco de pila actual. ESP es el puntero de pila y apunta a la dirección baja del marco de pila actual.

Recuerde que el concepto de memoria de apilamiento y pila gratuita/asignada es principalmente relevante a nivel de aplicación. A nivel de la máquina, toda la memoria tiene el mismo aspecto: le corresponde al programador (o compilador) hacer un seguimiento de qué segmentos de memoria están en uso.

La pila se gestiona mediante una combinación de: instrucciones que llaman a funciones y modificaciones explícitas a EBP y ESP. Cualquier cosa por debajo de ESP se considera liberada; así que para liberar memoria, solo puede agregar ESP.

El montón se gestiona mediante métodos de asignación de memoria; la documentación se puede encontrar here. No estoy seguro de los detalles de Winows, pero en general habrá algún administrador de memoria que tenga la responsabilidad de asegurarse de que no se asigna ningún bloque de memoria a más de una aplicación.

+1

Buena información gracias, ¿significa eso EBP - ESP = la cantidad total de tamaño del marco de la pila? – Daniel

+1

Derecha, y cuando se realiza una nueva llamada de función, el valor de EBP se guarda en la pila, el valor de ESP se transfiere a EBP y el tamaño del nuevo fotograma de pila se resta de ESP. – danben

+0

+1 respuesta muy útil, gracias! – kolistivra

Cuestiones relacionadas