El detective de hardware Ken Shirriff recurrió a su blog para explorar el conjunto de funciones y las posibles operaciones que se podrían realizar con la CPU x86 más antigua del mundo: la Intel 8086. Al seguir las operaciones de microcódigo de la 8086, Shirriff encontró algunas «opciones» de diseño inesperadas: desde el microcódigo propietario destinado a atrapar a los ladrones de IP a través de decisiones de diseño cuestionables (pero necesarias) que permitieron que los procesadores 8086 ejecutaran instrucciones desconocidas (con resultados igualmente poco conocidos), el trabajo de detective arroja algo de luz sobre lo que probablemente sea el lanzamiento de CPU más importante en los últimos cincuenta o así años.
La primera implementación del mundo del conjunto de instrucciones x86 en el 8086 de Intel fue lo que cabría esperar de una CPU lanzada a finales de los años setenta. Si bien los chips de vanguardia de hoy en día pueden transportar cientos de miles de millones de transistores (los componentes básicos para circuitos más complejos), la primera CPU x86 comercial de Intel, la Intel 8086 de 5-10 MHz, tuvo que arreglárselas con apenas 29 mil de ellos.
Los procesadores modernos le impiden ejecutar instrucciones inexistentes. Pero los primeros microprocesadores como el Intel 8086 (1978) no buscaban instrucciones ilegales. Ejecutar uno podría proporcionar una funcionalidad oculta o incluso dar acceso a registros ocultos a los que de otro modo no podría acceder.🧵 pic.twitter.com/BCdp7ZBY6V16 de julio de 2023
Más transistores generalmente equivalen a más rendimiento y, especialmente, a más funcionalidad (el apoyo mejorado para instrucciones más variadas y complejas y la aceleración basada en hardware son el ejemplo aquí). Entonces, como ahora, un equilibrio entre el rendimiento, la eficiencia energética y el recuento de transistores/área de troquel impuso limitaciones estrictas sobre cómo se manejaban las asignaciones de transistores y, en última instancia, qué características se consideraban «necesarias» y «desechables».
De acuerdo con el hallazgo de Shirriff, una peculiaridad particular del 8086 de Intel es que la CPU no poseía ningún control ni equilibrio para ejecutar el microcódigo, la capa más cercana al metal entre el software y el hardware que es responsable de dividir instrucciones complejas en una serie de más simples, paso a paso, que la CPU puede ejecutar. Pero con los transistores limitados a 29,000, Intel optó por no incluir un bloqueo a nivel de hardware sobre qué instrucciones se podían ejecutar y cuáles no. Por lo general, las instrucciones funcionan en base a una lista blanca: la CPU permite la ejecución de microcódigos que ya sabe que pueden procesarse dentro de su diseño de hardware.
Pero dado que el 8086 de Intel era tan estrecho para el espacio del transistor, la compañía en realidad no incorporó la lista blanca de operaciones de microcódigo que la CPU podía procesar, lo que significa que en presencia de operaciones de microcódigo «ilegales» (léase: no compatibles), el 8086 de Intel hizo todo lo posible para resolver la operación del microcódigo de todos modos, sin especificar el resultado de la operación «solicitada ilegalmente».
En total, el Intel 8086 admite 521 instrucciones, contenidas en su chip ROM de microcódigo (memoria de solo lectura). Algunas de esas 512 instrucciones estaban duplicadas (como mecanismos de respaldo y otras razones), pero otras nunca se hicieron públicas: ciertas operaciones de microcódigo quedaron sin documentar, ya sea por una funcionalidad planificada que nunca se implementó o por otras razones.
Sin embargo, un microcódigo interesante, verificado por Shirriff, ayudó a Intel a defender su IP de los posibles ladrones de IP. Al completar una lista de instrucciones de los 512 disponibles en la ROM del 8086, Shirring pudo discernir los códigos de operación con funciones conocidas (en blanco); los de naranja, amarillo y verde se dejaron en blanco para el 8086, pero se completaron en los siguientes procesadores de Intel, el 80186, 80286 y 80386 respectivamente; y finalmente, el valor atípico púrpura: un código de operación que se implementó en el 8086 de Intel y los procesadores posteriores, pero que nunca se documentó abiertamente.
La opinión de Shirriff sobre la bandera púrpura no documentada, que solo salió a la luz en los documentos de Intel hasta 2017, a pesar de vivir dentro del diseño x86 de la compañía desde el 8086, es que sirvió como una especie de trampa para cualquiera que busque copiar la tecnología de Intel. Si una empresa hubiera tomado atajos en el desarrollo de sus propias soluciones de CPU y, en cambio, hubiera robado la IP del microcódigo de Intel, entonces sus CPU llevarían a cabo la misma operación SALC (Establecer AL para llevar) cuando se alimentaran con los bits relevantes de código de máquina: es equivalente a una identificación de código de barras. eso permitiría a Intel procesar de manera más efectiva a cualquier ladrón de IP.
Desafortunadamente, el microcódigo de «trampa de derechos de autor» no sirvió de mucho a Intel, ni siquiera en los primeros días del 8086 cuando la competencia era más variada: Intel esperaba que su instrucción SALC se hubiera implementado en la propia versión de NEC (y mejor). Procesadores x86 de Intel en forma de procesadores NEC V20 y NEC V30. Pero no fue así: un fallo federal de 1989 afirmó que NEC no había infringido los derechos de autor de Intel (y, por lo tanto, las instrucciones de SALC no estaban allí). Pero suceden otras cosas cuando se inicia una demanda por infracción de derechos de autor, cosas que tienen poco que ver con los méritos de los derechos de autor en sí. La decisión de Intel de demandar y bloquear a NEC y la venta de sus procesadores V20 y V30 es parte de la razón por la que no hay más jugadores en la feroz escena competitiva del diseño de chips x86.