
El error F00F del Pentium es un fallo de diseño en la microarquitectura P5 de Intel , presente en las CPU basadas en ella, incluyendo el Pentium original , el Pentium MMX y el Pentium OverDrive . Descubierto en 1997, puede provocar que el procesador deje de funcionar hasta que se reinicie físicamente el ordenador . Este error se ha solucionado mediante actualizaciones posteriores del sistema operativo . Intel finalmente corrigió el fallo en la revisión B2 de sus chips, lanzada alrededor de 1999 .
El nombre es una abreviatura de F0 0F C7 C8, la codificación hexadecimal de una instrucción problemática . [ 1 ] Más formalmente, el error se llama error de instrucción CMPXCHG8B con operando inválido bloqueado . [ 2 ]
Descripción
En la arquitectura x86 , la secuencia de bytes F0 0F C7 C8representa la instrucción lock cmpxchg8b eax(comparación bloqueada e intercambio de 8 bytes en el registro EAX). El error también afecta a los códigos de operación que terminan en C9hasta CF, que especifican operandos de registro distintos de EAX. La F0 0F C7 C8instrucción no requiere ningún privilegio especial .
Esta codificación de instrucciones no es válida. La instrucción compara el valor de los registroscmpxchg8b EDX y EAX con un valor de 8 bytes en una ubicación de memoria. Sin embargo, en este caso se especifica un registro en lugar de una ubicación de memoria, lo cual no está permitido.
En circunstancias normales, esto simplemente generaría una excepción ; sin embargo, al usarse con el prefijo de bloqueo (que normalmente se utiliza para evitar que dos procesadores interfieran con la misma ubicación de memoria), la CPU utiliza erróneamente ciclos de bus bloqueados para leer el descriptor del controlador de excepciones de instrucción ilegal. Las lecturas bloqueadas deben ir acompañadas de escrituras bloqueadas, y la interfaz de bus de la CPU lo garantiza prohibiendo otros accesos a memoria hasta que se produzcan las escrituras correspondientes. Como no se producen, tras realizar estos ciclos de bus, toda la actividad de la CPU se detiene y esta debe reiniciarse para recuperarse.
Debido a la proliferación de microprocesadores Intel, la existencia de esta instrucción de privilegio abierto se consideró un problema grave en ese momento. Los proveedores de sistemas operativos respondieron implementando soluciones alternativas que detectaban la condición y evitaban el fallo. [ 3 ] La información sobre el error apareció por primera vez en Internet alrededor del 8 de noviembre de 1997. [ 4 ] Dado que el error F00F se ha vuelto de conocimiento común, el término se usa a veces para describir fallas de diseño de hardware similares, como el error de coma de Cyrix .
La ejecución de la instrucción F00F en un sistema vulnerable no produce daños permanentes en el hardware; simplemente se bloquea hasta que se reinicia. Sin embargo, es probable que se pierdan datos no guardados si no se han vaciado los búferes del disco , si las unidades se interrumpieron durante una operación de escritura o si se interrumpió alguna otra operación no atómica .
La revisión B2 solucionó este problema para los procesadores Pentium de Intel. [ 2 ]
La instrucción F00F puede considerarse un ejemplo de instrucción de "Alto y Apague el Fuego" (HCF, por sus siglas en inglés).
Soluciones alternativas
Aunque una solución definitiva a este problema requería algún tipo de revisión de hardware/firmware, en aquel momento se propusieron soluciones alternativas [ 1 ] que impedían la explotación de este problema para generar un ataque de denegación de servicio en la máquina afectada. Todas ellas se basaban en interrumpir forzosamente el patrón de accesos al bus defectuosos responsables del bloqueo del procesador. Las soluciones propuestas por Intel (y por lo tanto, "oficiales") requerían configurar la tabla de descriptores de interrupción de una manera poco natural que obligaba al procesador a emitir un fallo de página intermedio antes de poder acceder a la memoria que contenía el descriptor para la excepción de código de operación indefinido . Estos accesos a memoria externos resultaron ser suficientes para que la interfaz del bus dejara de lado el requisito de bloqueo que era la causa principal del error.
Específicamente, la tabla de descriptores de interrupción, que normalmente reside en una sola página de memoria, se divide en dos páginas, de manera que los descriptores de los primeros siete manejadores de excepciones residen en una página y el resto de la tabla en la página siguiente. El manejador para la excepción de código de operación indefinido es entonces el último descriptor en la primera página, mientras que el manejador para la excepción de fallo de página reside en la segunda página. Ahora se puede hacer que la primera página no esté presente (generalmente indicando una página que se ha intercambiado al disco para dejar espacio para otros datos), lo que obligará al procesador a obtener el descriptor para el manejador de la excepción de fallo de página. Este descriptor, que reside en la segunda página de la tabla, está presente en la memoria como de costumbre (de lo contrario, el procesador fallaría dos y luego tres veces , lo que provocaría un apagado). Estos ciclos de memoria adicionales anulan el requisito de bloqueo de memoria emitido por la instrucción ilegal original (ya que se supone que las instrucciones que fallan pueden reiniciarse después de que el manejador de excepciones regresa). Sin embargo, es necesario modificar el controlador de la excepción de fallo de página para que pueda gestionar la necesidad de proporcionar la página que falta para la primera mitad de la tabla de descriptores de interrupción , una tarea que normalmente no se le exige realizar.
La segunda solución oficial de Intel proponía mantener todas las páginas presentes en la memoria, pero marcando la primera página como de solo lectura. Dado que la instrucción ilegal original debía iniciar un ciclo de escritura en memoria, esto basta para forzar nuevamente la intervención del manejador de fallos de página. Esta variante tiene la ventaja de que las modificaciones necesarias en el manejador de fallos de página son mínimas en comparación con las requeridas para la primera variante; básicamente, solo necesita redirigir al manejador de excepciones indefinidas cuando corresponda. Sin embargo, esta variante requiere que se impida al propio sistema operativo escribir en páginas de solo lectura (mediante la configuración de un indicador global del procesador), y no todos los núcleos están diseñados de esta manera; de hecho, los núcleos más recientes sí lo están, ya que este es el mismo mecanismo básico utilizado para implementar la copia en escritura .
Se han propuesto soluciones alternativas distintas a las oficiales de Intel; en muchos casos, estas resultaron igual de efectivas y mucho más fáciles de implementar. [ 1 ] La más sencilla consistía simplemente en marcar la página que contenía los descriptores de interrupción como no almacenable en caché. De nuevo, los ciclos de memoria adicionales que el procesador se veía obligado a realizar para obtener datos de la RAM cada vez que necesitaba invocar un controlador de excepciones parecían ser suficientes para evitar que el procesador se bloqueara. En este caso, no se requirió ninguna modificación en ningún controlador de excepciones. Y, aunque no estrictamente necesario, se realizó la misma división de la tabla de descriptores de interrupción en este caso, marcando solo la primera página como no almacenable en caché. Esto se hizo por razones de rendimiento, ya que la página que contenía la mayoría de los descriptores (y los que se requerían con más frecuencia, de hecho) podía permanecer en la caché.
Por razones desconocidas, Intel nunca avaló estas soluciones alternativas no oficiales. Es posible que se sospechara que no funcionarían con todas las versiones de procesadores afectadas.
Véase también
Referencias
- 1 2 3 Collins, Robert R. (1998-05-01). "El error F00F del Pentium" . Dr. Dobb's Journal . Recuperado el 27 de julio de 2015 .
- 1 2 "81. Operando no válido con instrucción CMPXCHG8B bloqueada". Actualización de la especificación del procesador Pentium, versión 041 [ Fecha de lanzamiento enero de 1999 ] (PDF) . Santa Clara, California, EE. UU.: Intel Corporation . 1998. págs. 51 y siguientes . Número de pedido 242480-041. Archivado del original (PDF) el 4 de marzo de 2016. Recuperado el 27 de julio de 2015. PROBLEMA
: La instrucción CMPXCHG8B compara un valor de 8 bytes en EDX y EAX con un valor de 8 bytes en memoria (el operando de destino). Los únicos operandos de destino válidos para esta instrucción son operandos de memoria. Si el operando de destino es un registro, el procesador debe generar una excepción de código de operación no válido, la ejecución de la instrucción CMPXCHG8B debe detenerse y el procesador debe ejecutar el controlador de excepción de código de operación no válido. Esta errata se produce si se utiliza el prefijo LOCK con la instrucción CMPXCHG8B y un operando de destino de registro (no válido). En este caso, es posible que el procesador no inicie la ejecución del controlador de excepciones de código de operación no válido debido al bloqueo del bus. Esto provoca que el sistema se bloquee. IMPLICACIÓN: Si se utiliza un operando de destino de registro (no válido) con la instrucción CMPXCHG8B y el prefijo LOCK, el sistema puede bloquearse. No se corrompe ningún dato de memoria y el usuario puede reiniciar el sistema para volver al funcionamiento normal. Cabe destacar que la secuencia de código no válido específica necesaria para que se produzca esta errata no se genera normalmente durante la programación, ni Intel tiene constancia de que dicha secuencia sea generada por software comercial. Esta errata solo se aplica a los procesadores Pentium, Pentium con tecnología MMX, Pentium OverDrive y Pentium OverDrive con tecnología MMX. Los procesadores Pentium Pro, Pentium II e i486™ y anteriores no se ven afectados […]
- ↑ "torvalds/linux" . GitHub . Archivado del original el 23/06/2022 . Consultado el 09/07/2021 .
- ^ Flota, Onno; et al. (8 de noviembre de 1997). "Nieuwe Intel Pentium Bug" [ New Intel… ] (hilo de grupo de noticias, 38 publicaciones de 22 autores) (en holandés). Grupo de noticias : nl.comp.hardware . Consultado el 27 de julio de 2015 .
Si no sabe nada sobre la deuda, hay un nuevo error de Intel Pentium. Daardoor es un espacio de usuario exclusivo que permite que el Pentium se bloquee latentemente con 1 instrucción. Este error se produce para Intel Pentium y Intel Pentium MMX. Este error no existe en Intel Pentium Pro, Intel Pentium II, chips de AMD, Cyrix y este error está relacionado con algunos usuarios del sistema multiusuario (shell) instalado en un Intel Pentium. Op zo'n systeem kan elke user het systeem crashe…
Lecturas adicionales
- Crothers, Brooke (1997-11-10). "Net reacciona al error "F0" de Pentium" . Noticias de CNET . Recuperado el 27 de julio de 2015 .
- Collins, Robert R. (1998-05-01). "El error F00F del Pentium" . Dr. Dobb's Journal . Recuperado el 27 de julio de 2015 .
- "PC World" . PC World . Vol. 16. PC World Communications . 1998. pág. 55. Consultado el 27 de julio de 2015 .
Enlaces externos
- Errata de Intel Pentium
- Artículo de la Base de Conocimientos de Microsoft
- Entrada de error CVE F00F
- Arquitectura X86
- ataques de denegación de servicio
- Errores de hardware
- folclore informático
- 1997 en informática