2010-04-21 12 views
23

Por ejemplo, cuando llamamos decir, una función recursiva, las llamadas sucesivas se almacenan en la pila. Sin embargo, debido a un error si continúa infinitamente, el error es 'Error de segmentación' (como se ve en GCC).¿Cuál es la diferencia entre una falla de segmentación y un desbordamiento de pila?

¿No debería haber sido 'desbordamiento de pila'? ¿Cuál es la diferencia básica entre los dos?

Por cierto, una explicación sería más útil que los enlaces de wikipedia (pasó por eso, pero no hay respuesta a una consulta específica).

+4

Las cosas de desbordamiento se refieren a preguntas de programación, las cosas de falla se refieren a los servidores. oO –

+2

@Pavel: ¿qué tiene que ver SIGSEGV con los servidores? Aunque las aplicaciones de servidor pueden causar un error de segmentación, eso realmente no tiene nada que ver con la administración del servidor y todo tiene que ver con la programación. –

+5

@George: http://serverfault.com/ y whoosh. – kennytm

Respuesta

51

El desbordamiento de pila es [a] causa, el resultado es una falla de segmentación.


Al menos en x86 y ARM, la "pila" es un pedazo de memoria reservada para la colocación de las variables locales y las direcciones de las llamadas a funciones regresar. Cuando se agota la pila, se accederá a la memoria fuera del área reservada. Pero la aplicación no le pidió al kernel esta memoria, por lo que se generará un SegFault para la protección de la memoria.

3

La pila de llamadas se está desbordando, sin embargo, el resultado del desbordamiento es que eventualmente los valores relacionados con las llamadas se introducen en la memoria que no forma parte de la pila y luego - SIGSEGV!

3

Los procesadores modernos usan los administradores de memoria para proteger procesos entre sí. El administrador de memoria x86 tiene muchas características heredadas, una de las cuales es la segmentación. La segmentación está destinada a evitar que los programas manipulen la memoria de ciertas maneras. Por ejemplo, un segmento puede estar marcado como de solo lectura y el código se colocará allí, mientras que otro segmento es de lectura/escritura y ahí es donde se ubican sus datos.

Durante un desbordamiento de pila, agota todo el espacio asignado a uno de sus segmentos, y luego su programa comienza a escribir en segmentos que el administrador de memoria no permite, y luego obtiene un error de segmentación.

+1

Bastante seguro que Unix ha usado este término desde mucho antes de que llegara a estar cerca de x86 ... – SamB

+2

@SamB No veo de lo contrario la respuesta. "El administrador de memoria x86 tiene muchas características heredadas, una de las cuales es la segmentación"! = "La segmentación inventada x86". – JBentley

+2

La segmentación utilizada por x86 (los registros de segmento) es completamente diferente de la "Segmentación" del espacio de direcciones realizado por el sistema operativo. La falla de segmentación no tiene nada que ver con los registros de segmentos. Además, aunque sea parte de x86 durante mucho tiempo, los registros de segmento siguen siendo muy importantes para ver cómo funciona x86 en los sistemas operativos modernos. – SoapBox

2

Un desbordamiento de pila puede manifestarse como una excepción de desbordamiento de pila explícita (según el compilador y la arquitectura) o como un error de segmentación, es decir, un acceso de memoria no válido. En última instancia, un desbordamiento de la pila es el resultado de quedarse sin espacio en la pila, y un posible resultado de quedarse sin espacio en la pila es leer o escribir en la memoria a la que no debe acceder. Por lo tanto, en muchas arquitecturas, el resultado de un desbordamiento de pila es un error de acceso a la memoria.

Cuestiones relacionadas