Saltar al contenido

Cómo maneja el procesador el caso de división por cero

Solución:

Para responder en términos generales, en lugar de entrar en detalles sangrientos para Linux en x86_64, que probablemente oscurezcan los conceptos.

Las CPU tienden a lanzar una interrupción de excepción, en cosas como la división por cero o la desreferenciación de un puntero NULL. Estas interrupciones quedan atrapadas, como cuando el hardware interrumpe, detiene la ejecución del programa actual y devuelve el control al sistema operativo, que luego maneja el evento. Si bien las acciones dependen mucho del entorno, comúnmente el programa puede terminarse, todos los recursos liberados (memoria, archivos abiertos) y, opcionalmente, volcados de núcleo / seguimientos de pila generados con fines de depuración en un sistema de desarrolladores.

Es posible que un tiempo de ejecución pueda configurar cosas para que se llame a un controlador de excepciones, tal vez un lenguaje de scripting quiera detectar la división de enteros por 0 o el desbordamiento de enteros y luego lanzar una excepción del lenguaje de programación o generar diagnósticos para ayudar al programador a comprender dónde y por qué, sucedió. Generar una señal, que puede ser captada por la aplicación y manejada, o llevar a la terminación, es otra posibilidad tradicional.

En algunas CPU RISC, las trampas de software en el sistema operativo se ejecutarían para corregir los accesos de datos desalineados, por lo que la lectura de memoria funcionaría, pero con una penalización de rendimiento. En el pasado, las trampas a veces se usaban para emular instrucciones definidas pero que no estaban implementadas en el hardware por un modelo de CPU en particular. También he visto errores de memoria de hardware registrados, ya que el sistema operativo inicia una operación de recuperación de memoria ECC, aunque eso se maneja de manera diferente en x86.

Las llamadas al sistema, en realidad usan el mismo mecanismo para saltar, desde una aplicación de espacio de usuario, al kernel del sistema operativo que luego maneja el evento, de ahí el término común trap.

Permítanme intentar responder a esto de manera un poco diferente. Cada procesador con el que he trabajado define una estructura de vector de interrupción. En los chips Intel, esta estructura se denomina tabla de distribución de interrupciones (IDT). El vector de interrupción es una matriz de punteros a funciones. Cada entrada en la matriz corresponde a un evento específico (interrupción o excepción (falla o trampa)).

El sistema operativo configura las funciones (manejador de interrupciones, manejador de excepciones) para cada evento. Cuando se produce una división por cero, se activa una excepción. La CPU responde invocando el manejador de excepciones en el vector de interrupción correspondiente a una división por cero. En el Pentium, esta es la primera entrada de la tabla.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *