[The Old New Thing] 驴Puedo usar mi stack como me plazca?

En Windows, la pila crece de direcciones grandes a peque帽as. A veces se determina arquitect贸nicamente, y a veces es solo un acuerdo aceptado. El valor del puntero de la pila (registro del procesador) es un puntero al valor en la parte superior de la pila. Y los valores ubicados m谩s profundamente en la pila, respectivamente, se ubican en direcciones grandes. Pero, 驴qu茅 sucede con los datos ubicados en direcciones m谩s peque帽as que el puntero de la pila?



Las convenciones para algunas (pero no todas) arquitecturas definen la zona roja, que es el 谩rea de memoria debajo del puntero de la pila, pero que todav铆a es v谩lida para su uso por la aplicaci贸n.



Para Windows, el tama帽o de la zona roja var铆a seg煤n la arquitectura del hardware y, a menudo, es cero.


ArquitecturaTama帽o de zona roja
x860 bytes
x640 bytes
Itanium16 bytes *
Alpha AXP0 bytes
MIPS320 bytes
Powerpc232 bytes **
ARM328 bytes
ARM6416 bytes

* La plataforma Itanium tiene una caracter铆stica especial: la zona roja se encuentra arriba del puntero de la pila , y no debajo.
** En el caso de PowerPC, la zona roja es un efecto secundario del acuerdo de llamada .


Cualquier memoria detr谩s de la zona roja (en la pila) se considera vol谩til y el sistema operativo puede cambiarla en cualquier momento.


Pero en serio, 驴por qu茅 al sistema operativo le importa lo que hago con mi stack? Quiero decir, esta es mi pila! El sistema operativo no me dice qu茅 hacer con la memoria que VirtualAlloc trav茅s de VirtualAlloc . 驴Qu茅 hace que la pila sea diferente de cualquier otra memoria?


Considere el siguiente c贸digo para la plataforma x86 :


  MOV [esp-4], eax ;  eax    MOV ecx, [esp-4] ;     ecx CMP ecx, eax ;  ? JNZ panic ; N:  -  

Explicaci贸n del comentario para la instrucci贸n JNZ

La convenci贸n de codificaci贸n de ensamblaje dice que los comentarios para las instrucciones de rama deben describir el resultado si la rama se completa. En el ejemplo anterior, la instrucci贸n CMP hace la pregunta "驴Son iguales?". Y la instrucci贸n JNZ salta si no son iguales. Por lo tanto, el comentario comienza con "N:", lo que significa que la transici贸n se completar谩 si la respuesta a la pregunta anterior es "No", y el resto del comentario describe la situaci贸n cuando se realiza la transici贸n.


Convenci贸n de codificaci贸n de ensamblador?

S铆, tenemos una convenci贸n de codificaci贸n para ensamblador.


驴Es posible que se implemente una transici贸n condicional?


Como no hay zona roja en x86, la memoria con desplazamientos negativos en relaci贸n con el puntero de la pila se puede sobrescribir en cualquier momento. Por lo tanto, para el c贸digo anterior, es posible la transici贸n a la etiqueta de panic .


El depurador puede usar la memoria detr谩s de la zona roja como un lugar conveniente para almacenar sus datos. Por ejemplo, si usa el comando .call , el depurador realizar谩 una llamada anidada en la misma pila y probablemente usar谩 parte de este espacio de pila para guardar los registros y poder restaurarlos despu茅s de regresar de la funci贸n llamada. Por lo tanto, cualquier informaci贸n almacenada fuera de la zona roja ser谩 destruida.


Incluso durante el funcionamiento normal, el sistema operativo puede en cualquier momento sobrescribir datos fuera de la zona roja. Aqu铆, por ejemplo, c贸mo puede suceder esto:


Supongamos que su hilo ejecuta su franja horaria justo despu茅s de guardar los datos detr谩s de la zona roja. Mientras su hilo espera para reanudar la ejecuci贸n, el administrador de memoria elimina temporalmente una p谩gina f铆sica de su c贸digo. Al final, su hilo vuelve a tener el control y el administrador de memoria intenta intercambiar la p谩gina de c贸digo nuevamente (p谩gina adentro). 隆Oh, no, se produce un error de E / S durante la b煤squeda! El sistema operativo empuja un marco de excepci贸n para STATUS_IN_PAGE_ERROR en la pila, lo que conduce a la corrupci贸n de datos que guard贸 detr谩s de la zona roja.


El sistema operativo despacha esta excepci贸n. Accede al controlador de excepciones de vectores ( VEH ), que es otra parte de su programa. El controlador se instal贸 espec铆ficamente para manejar situaciones excepcionales que surgen del posible lanzamiento de su programa directamente desde un CD-ROM o una red FS no confiable. El programa muestra una solicitud en la que le pide al usuario que inserte el CD nuevamente y le ofrece intentarlo nuevamente. Si el usuario dice lo que debe repetirse, el controlador de excepciones de vector devuelve EXCEPTION_CONTINUE_EXECUTION y el sistema operativo reiniciar谩 las instrucciones en las que se produjo la excepci贸n.


Esta vez, el reinicio se realiza correctamente porque el CD-ROM est谩 presente (y le铆do) y el c贸digo se puede bombear con 茅xito a la memoria. Se ejecuta la siguiente instrucci贸n, que carga el valor fuera de la zona roja en el ecx . Pero este no es el mismo valor que se guard贸 en la declaraci贸n anterior, ya que la excepci贸n STATUS_IN_PAGE_ERROR sobrescribe. La comparaci贸n dice que los datos son diferentes, y vamos a la etiqueta de panic .


Si desea guardar los datos en la pila, p贸ngalos all铆 correctamente: primero reduzca el puntero de la pila y luego guarde el valor en la parte v谩lida de la pila. No oculte datos detr谩s de la zona roja, esta memoria se puede cambiar en cualquier momento sin su conocimiento.

Source: https://habr.com/ru/post/es435814/


All Articles