En ingeniería informática, Halt and Catch Fire , conocido por el mnemónico de ensamblaje HCF , es un modismo que se refiere a una instrucción de código de máquina de computadora que hace que la unidad central de procesamiento (CPU) de la computadora deje de funcionar de manera significativa, lo que generalmente requiere reiniciar la computadora. Originalmente se refería a una instrucción ficticia en computadoras IBM System / 360 (introducida en 1964), haciendo una broma sobre sus numerosos mnemónicos de instrucción no obvios.
Con la llegada del MC6800 (introducido en 1974), los programadores descubrieron un defecto de diseño. Debido a la decodificación incompleta del código de operación , dos códigos de operación ilegales , 0x9D y 0xDD, harán que el contador del programa en el procesador se incremente infinitamente, lo que bloquea el procesador hasta que se reinicia. Estos códigos se han denominado extraoficialmente HCF. Durante el proceso de diseño del MC6802, los ingenieros originalmente planearon eliminar esta instrucción, pero la mantuvieron como estaba para propósitos de prueba. Como resultado, HCF fue reconocido oficialmente como una verdadera instrucción. [1] [2]Más tarde, HCF se convirtió en un término humorístico general para las instrucciones que pueden congelar un procesador, incluidas las instrucciones intencionales con fines de prueba e instrucciones ilegales no intencionales. Algunos se consideran defectos de hardware y, si se comparte el sistema , un usuario malintencionado puede ejecutarlo para lanzar un ataque de denegación de servicio .
En el caso de instrucciones reales, la implicación de esta expresión es que, mientras que en la mayoría de los casos en los que una CPU ejecuta una instrucción no intencionada (un error en el código), la computadora aún puede recuperarse, en el caso de una instrucción HCF Por definición, no hay forma de que el sistema se recupere sin reiniciar.
La expresión "prenderse fuego" es una exageración graciosa de la velocidad con la que el chip de la CPU cambiaría algunos circuitos de bus, provocando que se sobrecalienten y se quemen. [3]
Etimología
Las historias apócrifas conectan este término con un código de operación ilegal en IBM System / 360 . Un procesador, al encontrar la instrucción, comenzaría a cambiar las líneas de bus muy rápido, lo que podría provocar un sobrecalentamiento. [4] [5]
Nemotécnicos en lenguaje ensamblador
En el lenguaje ensamblador de una computadora , se utilizan mnemónicos que son directamente equivalentes a las instrucciones del código de máquina . Los mnemónicos suelen tener tres letras, como ADD, CMP (para comparar dos números) y JMP (saltar a una ubicación diferente en el programa). La instrucción HCF fue originalmente una instrucción ficticia en lenguaje ensamblador, que se dice que está en desarrollo en IBM para su uso en sus computadoras System / 360 , junto con muchas otras siglas divertidas de tres letras como XPR (Ejecutar programador) y CAI (Información contable corrupta). [6] y similar a otros mnemónicos de broma como "SDI" para "Autodestrucción inmediata" [6] y "CRN" para Convertir a números romanos. [7] Una lista de tales mnemónicos, incluido el HCF, aparece como "Mnemónicos sobreextendidos" en la edición de abril de 1980 de la parodia de Creative Computing . [8]
El IBM System / 360 ya incluidos numerosos nemotécnicos no obvios, como ZAP (Zero y añadir pic), EDMk (Edit and Mark), TRT (Traducir y probar), y leer hacia atrás (una junta de comandos de E / canal), [9] y los programadores comenzaron a crear instrucciones igualmente crípticas, pero ficticias, en una vena humorística. [10] [11]
En una discusión de USENET de 1990 , se afirmó que HCF se remontaba a antes de 1977. [12] [13]
En la novela de ciencia ficción / fantasía de Rick Cook , The Wizardry Compiled , sobre programadores transportados a un universo donde la magia podría ser programada, uno de ellos se refiere al comando como HMCF, para "Halt, Melt and Catch Fire".
En TIS-100 , un videojuego de rompecabezas de 2015 creado por Zachtronics , hay un logro llamado HALT_AND_CATCH_FIRE por bloquear la máquina con un código de operación oculto. [14]
En CPU modernas
Los diseñadores de CPU a veces incorporan una o más instrucciones de código de máquina no documentadas con fines de prueba, como la instrucción IBM System / 360 DIAGnose. [9]
Motorola 6800
El microprocesador Motorola 6800 fue el primero por el cual se hizo ampliamente conocido un HCF mnemónico de ensamblaje indocumentado. Los códigos de operación ( opcodes -las partes de las instrucciones en lenguaje máquina que especifican una operación a realizar) son hexadecimal 9D y DD, y se informaron, y dada la no oficial [15] HCF mnemónico en un artículo escrito por Gerry Wheeler en diciembre 1.977 número de la revista BYTE sobre códigos de operación indocumentados. [15] Wheeler señaló que Motorola informó 197 códigos de operación válidos para el procesador M6800, por lo que infirió que con 256 combinaciones posibles de 8 bits, debe haber 59 "instrucciones inválidas". Continúa describiendo el HCF como una "gran sorpresa", y dice de la parte Catch Fire del apodo, "Bueno, casi":
Cuando se ejecuta esta instrucción, la única forma de ver lo que está haciendo es con un osciloscopio . Desde el punto de vista del usuario, la máquina se detiene y desafía la mayoría de los intentos de reiniciarla. Aquellas personas con luces indicadoras en el bus de direcciones verán que el procesador comienza a leer toda la memoria, secuencialmente, muy rápidamente. En efecto, el bus de direcciones se convierte en un contador de 16 bits. Sin embargo, el procesador no se da cuenta de lo que está leyendo ... simplemente lee. [15]
El proceso es revisado por David Agans, así:
En los viejos tiempos del microprocesador Motorola 6800, el código de instrucción DD hacía que el procesador entrara en un bucle sin fin, leyendo cada dirección de memoria en orden. (Otros ingenieros se refirieron a esto como la instrucción "Detener y atrapar fuego" [HCF], pero recordamos el código llamándolo instrucción "Drop Dead"). El modo Drop Dead fue maravilloso para detectar la sincronización del hardware y resolver problemas lógicos con un alcance ; Todas las líneas de dirección y reloj eran agradables, ondas cuadradas en bicicleta. [dieciséis]
Es decir, cualquiera de los códigos de operación hizo que el procesador entrara en un modo , realizando continuamente ciclos de lectura de memoria desde direcciones sucesivas sin búsquedas de instrucciones intermedias. Por lo tanto, el bus de direcciones se convirtió efectivamente en un contador , lo que permitió verificar rápidamente el funcionamiento de todas las líneas de direcciones . Una vez que el procesador entraba en este modo, no respondía a las interrupciones , por lo que el funcionamiento normal sólo podía restablecerse mediante un reinicio (de ahí los apodos "Drop Dead" y "Detener y atrapar fuego"). Por lo tanto, estas referencias se referían al comportamiento insensible de la CPU en este estado y no a ninguna forma de comportamiento errático. [ cita requerida ]
Otras instrucciones similares a HCF se encontraron más tarde en el Motorola 6800 al ejecutar códigos de operación no documentados FD (ciclo dos veces más lento que 9D / DD) o CD / ED (ciclo a una frecuencia muy baja legible por humanos en un número limitado de líneas de alta dirección) . [17]
Se cree que el HCF mnemónico es la primera función de autoprueba incorporada en un microprocesador de Motorola. [2]
Intel x86
El Intel 8086 y los procesadores posteriores de la serie x86 tenían una instrucción HLT (detener), código de operación F4, que detuvo la ejecución de la instrucción y colocó el procesador en un estado HALT. Una interrupción habilitada, una excepción de depuración, la señal BINIT, la señal INIT o la señal RESET reanudaron la ejecución, lo que significaba que el procesador siempre podía reiniciarse. [18] Algunos de los primeros chips Intel DX4 tenían un problema con la instrucción HLT y no se podían reiniciar después de usar esta instrucción, lo que deshabilitó la computadora y convirtió HLT en una instrucción más de HCF. El kernel de Linux agregó una opción "no-hlt" que le dice a Linux que ejecute un bucle infinito en lugar de usar HLT, lo que permitió a los usuarios de estos chips rotos usar Linux. [19]
El 80286 tiene el código de operación sin documentar 0F 04, lo que hace que la CPU se cuelgue cuando se ejecuta. La única salida es reiniciar la CPU. [ cita requerida ] [20] En algunas implementaciones, el código de operación fue emulado a través de BIOS como una secuencia de detención . [21]
Muchas computadoras de la línea Intel Pentium podrían bloquearse ejecutando una instrucción no válida (F00F C7C8), lo que provocó que la computadora se bloqueara. Esto se conoció como el error Pentium F00F . Ningún compilador crearía la instrucción, pero un programador malintencionado podría insertarla en el código para dejar inoperable una computadora afectada hasta que se apague y encienda la máquina . Desde su descubrimiento, se han desarrollado soluciones para evitar que bloquee la computadora, y el error se ha eliminado en los procesadores Intel posteriores. [22] [23]
Durante Black Hat USA 2017 , Christopher Domas demostró que ha encontrado una nueva instrucción "Detener y atrapar fuego" actualmente desconocida [24] [25] en un modelo de procesador x86 en particular usando su propio procesador fuzzer x86 llamado sandsifter. [26]
Otras CPU
El MOS Technology 6502 tiene 12 instrucciones no válidas que se congele la CPU. [27] [28]
En el Zilog Z80 , la ejecución de DI (deshabilitar interrupciones) seguido de HALT (esperar una interrupción) hace que la CPU permanezca congelada indefinidamente, esperando una interrupción que no puede ocurrir. El núcleo del procesador Sharp similar en el sistema LR35902 de Game Boy en el chip contiene una solución parcial que le permite recuperarse de un HALT, como la instrucción WAI análoga del 65C02, pero se congela con tres HALT consecutivos con interrupciones desactivadas. [29] El núcleo en sí contiene no menos de 11 códigos de operación que bloquean completamente la CPU cuando se ejecutan. [30]
El Z80 también admite una interrupción no enmascarable. [31] [32] La señal / NMI está en el pin 17 del paquete DIP original de 40 pines. [33] [34] Dado que una interrupción no enmascarable recuperará el control de la CPU incluso después de ejecutar la secuencia de instrucciones DI / HALT, ese par no representa una HCF verdadera. Solo resultará en una condición de HCF si el pin / NMI está conectado directamente al riel de + 5V, haciendo imposible la generación de esa señal, o si la rutina de interrupción que servicios / NMI termina con un retorno, colocándola nuevamente en el Estado HALT.
Ver también
- Error de coma de Cyrix
- Golpe asesino
- lp0 en llamas
- Memoria de solo escritura (broma)
Referencias
- ^ http://bytecollector.com/archive/digital_group/documentation/hardware/dg_systems/system_cards/6800_cpu_card/6800_Instruction_Set.PDF MC6800 Conjunto de instrucciones
- ↑ a b Daniels, R. Gary; Bruce, William (abril de 1985). "Tendencias de autoprueba incorporadas en microprocesadores de Motorola". Diseño y prueba IEEE . 2 (2): 64–71. doi : 10.1109 / MDT.1985.294865 .
Para colmo de males, descubrimos que teníamos un HACOF ilegal, una instrucción que nuestros clientes encontraron en el MC6800. Era un código de operación no utilizado, una instrucción ilegal. Cuando se ejecuta inadvertidamente, el contador del programa aumentaría indefinidamente. El problema, causado por la decodificación incompleta del código de operación, era una molestia porque Reset era el único medio de terminar la instrucción. ... Durante el proceso de diseño, descubrimos cómo eliminar la instrucción HACOF. Aproximadamente en ese momento, los ingenieros de producto se acercaron a nosotros con una idea. Dijeron: '¿Sabes lo que realmente nos gustaría? Alguna forma de probar rápidamente la RAM. Si de alguna manera pudiéramos apuntar el contador del programa a la primera dirección de RAM y luego simplemente incrementar a través de la RAM, podríamos probarlo mucho más rápido '. Dado que la 'instrucción' de HACOF hizo precisamente eso, y realmente no queríamos invertir el esfuerzo necesario para eliminarla, respondimos: '¡Tenemos un trato para usted!' De este modo, HACOF se convirtió en la primera función de autoprueba incorporada intencional en un microprocesador de Motorola.
- ^ Entrada de archivo de jerga para el mnemónico de ensamblaje de HCF
- ^ Clements, Alan (28 de octubre de 2006). Incorporación de la ética en la arquitectura informática . Conferencia de Fronteras en Educación de ASEE / IEEE (36 ed.). pag. 4 . Consultado el 2 de marzo de 2018 .
- ^ Kohler, Eddie (4 de abril de 2005). "CS111 - Lecture 1" (PDF) . pag. 2 . Consultado el 2 de marzo de 2018 .
- ^ a b Dunlap, Bryan. "Un conjunto de instrucciones propuesto" . Departamento de Física, Universidad Estatal de Ohio . Archivado desde el original el 8 de septiembre de 2017 . Consultado el 20 de junio de 2016 .
- ^ Códigos de operaciones lejanos , Werner Cirsovius, archivado desde el original el 5 de marzo de 2016 , consultado el 28 de mayo de 2015
- ^ "Overextended Mnemonics" , Creative Computing , 6 (4): 17 (hex) (reverso), abril de 1980 , consultado el 12 de marzo de 2017
- ^ a b IBM System / 360 Principles of Operation (PDF) , IBM , consultado el 2 de julio de 2014
- ^ "Bromas de Kevin Korb: ensamblador Opcodes que deberían existir" . Consultado el 13 de diciembre de 2016 .
- ^ "Comandos olvidados del lenguaje ensamblador" . Consultado el 13 de diciembre de 2016 .
- ^ "Asunto: instrucción HCF: de los principios de funcionamiento" , archivado en textfiles.com
- ^ "mnemónicos de código de operación apócrifos, largos" , 23 de abril de 1990, alt.folklore.computers , (a través de Grupos de Google)
- ^ https://steamcommunity.com/stats/370360/achievements
- ^ a b c Wheeler, Gerry (diciembre de 1977). "Instrucciones M6800 sin documentar" . BYTE . Vol. 2 no. 12. págs. 46–47.
Los mnemónicos son, por supuesto, asignados por mí.
- ^ Agans, David J. (2002). Depuración: las 9 reglas indispensables para encontrar incluso los problemas de software y hardware más esquivos . Nueva York: American Management Association. pag. 77. ISBN 9780814426784. OCLC 52043345 .
- ^ Demeulemeester, Samuel. "Investigando la instrucción HCF (Halt & Catch Fire) en Motorola 6800" . X86.FR - Laboratorio de I + D de Doc TB . Consultado el 26 de marzo de 2021 .
- ^ "Referencia del conjunto de instrucciones x86: HLT" . Consultado el 2 de julio de 2014 .
- ^ Gortmaker, Paul (21 de marzo de 2003). "El indicador de inicio de Linux: cómo" (PDF) . El proyecto de documentación de Linux . Consultado el 2 de julio de 2014 .
- ^ "Re: códigos de operación no documentados (HINT_NOP)" . Archivado desde el original el 6 de noviembre de 2004 . Consultado el 7 de noviembre de 2010 .
- ^ "Re: También algunos códigos de operación 0Fh indocumentados" . Archivado desde el original el 26 de junio de 2003 . Consultado el 7 de noviembre de 2010 .
- ^ Collins, Robert R. (1 de mayo de 1998). "El error Pentium F00F: soluciones para un problema desagradable" . Diario del Dr. Dobb .
- ^ Actualización de la especificación del procesador Pentium (PDF) . Intel Corporation . Enero de 1999. págs. 51–52. número de pedido 242480-041 . Consultado el 2 de noviembre de 2006 .
- ^ "Rompiendo el x86 ISA (PDF)" (PDF) . Christopher Domas . Consultado el 9 de diciembre de 2017 .
- ^ "Rompiendo el x86 ISA (video)" . Christopher Domas . Consultado el 9 de diciembre de 2017 .
- ^ "Sandsifter: el fuzzer del procesador x86" . Christopher Domas . Consultado el 9 de diciembre de 2017 .
- ^ Steil, Michael. "Cómo funcionan realmente los códigos de operación ilegales MOS 6502" . pagetable.com .
- ^ Offenga, Freddy. "6502 Opcodes indocumentados" . NesDev .
- ^ "Manual de la CPU de GameBoy" (PDF) .
- ^ "Conjunto de instrucciones de la CPU de Game Boy" .
- ^ "Mecanismo de interrupción - Desarrollo - ¡Poder de SMS!" .
- ^ Flammenkamp, Achim. "Comportamiento de interrupción de la CPU Z80" .
- ^ "Pinouts - familia Z80" .
- ^ Vis, Peter J. "Pinout Zilog Z80" .