El fallo Pentium F00F es un defecto de diseño en la mayoría de Intel Pentium , Pentium MMX , y Pentium OverDrive procesadores (todos en la microarquitectura P5 ). Descubierto en 1997, puede provocar que el procesador deje de funcionar hasta que la computadora se reinicie físicamente. El error se ha evitado mediante actualizaciones del sistema operativo .
El nombre es una abreviatura de F0 0F C7 C8
la codificación hexadecimal de una instrucción infractora . [1] Más formalmente, el error se denomina operando no válido con error de instrucción CMPXCHG8B bloqueado . [2]
Descripción
En la arquitectura x86 , la secuencia de bytes F0 0F C7 C8
representa la instrucción lock cmpxchg8b eax
(comparación bloqueada e intercambio de 8 bytes en el registro EAX). El error también se aplica a los códigos de operación que terminan en C9
hasta CF
, que especifican operandos de registro distintos de EAX. La F0 0F C7 C8
instrucción no requiere ningún privilegio especial .
La codificación de esta instrucción no es válida. La cmpxchg8b
instrucción compara el valor en los registros EDX y EAX con un valor de 8 bytes en una ubicación de memoria. En este caso, sin embargo, se especifica un registro en lugar de una ubicación de memoria, lo cual no está permitido.
En circunstancias normales, esto simplemente resultaría en una excepción ; sin embargo, cuando se usa con el prefijo de bloqueo (normalmente se usa para evitar que dos procesadores interfieran con la misma ubicación de memoria), la CPU usa erróneamente ciclos de bus bloqueados para leer el descriptor del manejador de excepciones de instrucción ilegal. Las lecturas bloqueadas deben emparejarse con las escrituras bloqueadas, y la interfaz de bus de la CPU hace cumplir esto al prohibir otros accesos a la memoria hasta que se produzcan las escrituras correspondientes. Como ninguno está disponible, después de realizar estos ciclos de bus, toda la actividad de la CPU se detiene y la CPU debe reiniciarse para recuperarse.
Debido a la proliferación de microprocesadores Intel, la existencia de esta instrucción de privilegios abiertos se consideró un problema grave en ese momento. Los proveedores de sistemas operativos respondieron implementando soluciones que detectaron la condición y evitaron el bloqueo. La información sobre el error apareció por primera vez en Internet alrededor del 8 de noviembre de 1997. [3] 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 Cyrix .
No se producen daños permanentes en el hardware al ejecutar la instrucción F00F en un sistema vulnerable; simplemente se bloquea hasta que se reinicia. Sin embargo, la pérdida de datos de los datos no guardados es probable si los búferes de disco no se han vaciado, si las unidades fueron interrumpidos durante una operación de escritura, o si algún otro no- operación atómica fue interrumpido.
El paso B2 resolvió este problema para los procesadores Pentium de Intel. [2]
La instrucción F00F puede considerarse un ejemplo de instrucción Detener y atrapar fuego (HCF).
Soluciones alternativas
Aunque una solución definitiva a este problema requería algún tipo de revisión de hardware / firmware, se propusieron soluciones alternativas en ese momento [1] que impedían la explotación de este problema para generar un ataque de denegación de servicio en la máquina afectada. Todos ellos se basaron en romper enérgicamente el patrón de accesos de bus defectuosos responsables del bloqueo del procesador. Las soluciones propuestas por Intel (por lo tanto, "oficiales") requerían configurar la tabla de descriptores de interrupción de una manera antinatural que obligaba al procesador a emitir una falla de página intermedia antes de que pudiera acceder a la memoria que contiene el descriptor para la excepción de código de operación indefinido. Estos accesos extraños a la memoria 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 interrupciones, que normalmente reside en una sola página de memoria, se divide en dos páginas de modo 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 controlador de la excepción de código de operación no definido es el último descriptor de la primera página, mientras que el controlador de la excepción de error de página reside en la segunda página. La primera página ahora se puede convertir en no presente (generalmente significa una página que se ha intercambiado en el disco para dejar espacio para algunos otros datos), lo que obligará al procesador a buscar el descriptor para el controlador de excepciones de fallas de página. Este descriptor, que reside en la segunda página de la tabla, está presente en la memoria como de costumbre (si no lo estuviera, el procesador tendría una falla doble y luego triple, 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 con fallas pueden reiniciarse después de que regrese el manejador de excepciones). Sin embargo, el controlador de la excepción de error de página debe modificarse para hacer frente a la necesidad de proporcionar la página que falta para la primera mitad de la tabla de descriptores de interrupciones, una tarea que normalmente no se requiere realizar.
La segunda solución alternativa oficial de Intel propuso mantener todas las páginas presentes en la memoria, pero marcar la primera página como de solo lectura. Dado que se suponía que la instrucción ilegal originaria emitía un ciclo de escritura en memoria, esto es suficiente para forzar nuevamente la intervención del manejador de fallas de página. Esta variante tiene la ventaja de que las modificaciones necesarias para el controlador de errores de página son muy pequeñas en comparación con las necesarias para la primera variante; Básicamente, solo necesita redirigir al controlador de excepciones indefinidas cuando sea apropiado. Sin embargo, esta variante requiere que se evite que el sistema operativo escriba en páginas de solo lectura (mediante la configuración de un indicador de procesador global), y no todos los núcleos están diseñados de esta manera; de hecho, los núcleos más recientes lo son, ya que este es el mismo mecanismo básico que se usa para implementar la copia en escritura .
Se han propuesto soluciones alternativas adicionales a las oficiales de Intel; en muchos casos, resultaron ser eficaces y mucho más fáciles de implementar. [1] El más simple implicó simplemente marcar la página que contiene descriptores de interrupción como no almacenable en caché. Nuevamente, los ciclos de memoria adicionales que el procesador se vio obligado a atravesar para obtener datos de la RAM cada vez que necesitaba invocar un controlador de excepciones parecía ser todo lo que se necesitaba para evitar que el procesador se bloqueara. En este caso, no se requirió modificación alguna a ningún manejador de excepciones. Y, aunque no es estrictamente necesario, en este caso se realizó la misma división de la tabla de descriptores de interrupciones, con solo la primera página marcada como no almacenable en caché. Esto se debió a razones de rendimiento, ya que la página que contiene la mayoría de los descriptores (y los que se requieren con más frecuencia, de hecho) podría permanecer en la memoria caché.
Por razones desconocidas, estas soluciones alternativas no oficiales nunca fueron respaldadas por Intel. Es posible que se sospechara que podrían no funcionar con todas las versiones de procesador afectadas.
Ver también
Referencias
- ↑ a b c Collins, Robert R. (1 de mayo de 1998). "El error Pentium F00F" . Diario del Dr. Dobb . Consultado el 27 de julio de 2015 .
- ^ a b Intel (1998). "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, CA, EE.UU .: Intel . pag. 51 f . Archivado desde el original ( PDF ) el 4 de marzo de 2016 . Consultado el 27 de julio de 2015 . La apertura de esta actualización de especificación dice:
PROBLEMA: La instrucción CMPXCHG8B compara un valor de 8 bytes en EDX y EAX con un valor de 8 bytes en la memoria (el operando de destino). Los únicos operandos de destino válidos para esta instrucción son los 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álida, la ejecución de la instrucción CMPXCHG8B debe detenerse y el procesador debe ejecutar el manejador de excepciones de código de operación no válido. Esta errata ocurre si el prefijo LOCK se usa con la instrucción CMPXCHG8B con 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 excepción de código de operación no válido porque el bus está bloqueado. Esto da como resultado un bloqueo del sistema. CONSECUENCIA: 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 hay datos de la memoria dañados y el usuario puede realizar un reinicio del sistema para volver al funcionamiento normal. Tenga en cuenta que la secuencia de código no válida específica necesaria para que se produzca esta errata no se genera normalmente en el curso de la programación ni Intel sabe que dicha secuencia se genera mediante software disponible comercialmente. Esta errata solo se aplica a procesadores Pentium, procesadores Pentium con tecnología MMX, procesadores Pentium OverDrive y procesadores Pentium OverDrive con tecnología MMX. Los procesadores Pentium Pro, los procesadores Pentium II y los procesadores i486TM y anteriores no se ven afectados ...
- ^ Hovers, Onno; et al. (8 de noviembre de 1997). "Nieuwe Intel Pentium Bug" [New Intel…] (hilo del grupo de noticias, 38 publicaciones de 22 autores) (en holandés). Grupo de noticias : nl.comp.hardware . Consultado el 27 de julio de 2015 .
También se burlan de gehoord hebt, er es un nieuwe Intel Pentium BUG. Daardoor es el espacio de usuario más amplio que se encuentra en el Pentium, en el último momento, se bloquea con 1 instrucción. El error está disponible para Intel Pentium y Intel Pentium MMX. El error no es compatible con Intel Pentium Pro, Intel Pentium II, los chips de AMD, Cyrix y Deze, el error es diferente al de otros sistemas multiusuario (shell) que se ejecutan en Intel Pentium. Op zo'n systeem kan elke user het systeem crashen ...
Otras lecturas
- Crothers, Brooke (10 de noviembre de 1997). "Net reacciona a" F0 "error de Pentium" . Noticias CNET . en línea . Consultado el 27 de julio de 2015 .
- Collins, Robert R. (1 de mayo de 1998). "El error Pentium F00F" . Diario del Dr. Dobb . Consultado el 27 de julio de 2015 .
- "PC World" . 16 . 1998: 55 . Consultado el 27 de julio de 2015 . Cite journal requiere
|journal=
( ayuda )
enlaces externos
- Errata de Intel Pentium
- Artículo de la base de conocimientos de Microsoft
- Entrada de error de vulnerabilidades comunes F00F