En arquitectura de computadoras , el microcódigo es una capa de datos o instrucciones de control de bajo nivel que se utiliza para implementar la arquitectura del conjunto de instrucciones de un procesador o las secuencias de control internas. [ 1 ] Consiste en operaciones a nivel de hardware que ejecutan instrucciones de código máquina de nivel superior o secuenciación interna directa en muchos componentes digitales. En muchos procesadores modernos de propósito general de Intel y AMD , las instrucciones comunes se decodifican directamente en microoperaciones internas, mientras que el microcódigo se utiliza principalmente para instrucciones más complejas, casos especiales y actualizaciones del procesador. [ 2 ]
El microcódigo, alojado en una memoria especial de alta velocidad, traduce las instrucciones de la máquina, los datos de la máquina de estados u otras entradas en secuencias de operaciones detalladas a nivel de circuito. Separa las instrucciones de la máquina de la electrónica subyacente , lo que permite una mayor flexibilidad en el diseño y la modificación de las instrucciones. Además, facilita la construcción de instrucciones complejas de varios pasos, al tiempo que reduce la complejidad de los circuitos informáticos. El acto de escribir microcódigo se conoce como microprogramación , y el microcódigo en una implementación específica de procesador se denomina a veces microprograma .
Mediante una microprogramación exhaustiva, las microarquitecturas de menor escala y simplicidad pueden emular arquitecturas más robustas con longitudes de palabra mayores, unidades de ejecución adicionales , etc. Este enfoque proporciona un método relativamente sencillo para garantizar la compatibilidad del software entre diferentes productos dentro de una misma familia de procesadores.
Descripción general
Conjuntos de instrucciones
A nivel de hardware, los procesadores contienen varias áreas de circuitos separadas, o "unidades", que realizan diferentes tareas. Las unidades más comunes incluyen la unidad aritmético-lógica (ALU), que ejecuta instrucciones como la suma o la comparación de dos números; circuitos para leer y escribir datos en la memoria externa; y pequeñas áreas de memoria interna para almacenar estos valores mientras se procesan. En la mayoría de los diseños, se utiliza memoria adicional de alto rendimiento, el banco de registros , para almacenar valores temporales, no solo los necesarios para la instrucción actual. [ 3 ]
Para ejecutar correctamente una instrucción, los distintos circuitos deben activarse en orden. Por ejemplo, no es posible sumar dos números si aún no se han cargado desde la memoria. En los diseños RISC , el orden correcto de estas instrucciones depende en gran medida del programador, o al menos del compilador del lenguaje de programación que esté utilizando. Así, para sumar dos números en memoria y almacenar el resultado en memoria, por ejemplo, el compilador puede generar instrucciones para cargar uno de los valores en un registro, el segundo en otro, realizar la suma en la ALU, colocar el resultado en un registro y, finalmente, almacenar ese registro en la memoria. [ 3 ]
Como la secuencia de instrucciones necesarias para completar este concepto de nivel superior, "sumar estos dos números en memoria", puede requerir múltiples instrucciones, esto puede representar un cuello de botella en el rendimiento si dichas instrucciones se almacenan en la memoria principal . Leer esas instrucciones una por una consume tiempo que podría utilizarse para leer y escribir los datos reales. Por esta razón, es común que los diseños que no son RISC tengan muchas instrucciones diferentes que difieren principalmente en dónde almacenan los datos. Por ejemplo, el MOS 6502 tiene ocho variaciones de la instrucción de suma, ADCque difieren únicamente en dónde buscan los dos operandos. [ 4 ]
Utilizar la variación de la instrucción, o " código de operación ", que mejor se ajuste a la operación final puede reducir el número de instrucciones a una, ahorrando memoria utilizada por el código del programa y mejorando el rendimiento al dejar el bus de datos libre para otras operaciones. Sin embargo, internamente, estas instrucciones no son operaciones separadas, sino secuencias de las operaciones que las unidades realizan realmente. Convertir una sola instrucción leída de la memoria en la secuencia de acciones internas es tarea de la unidad de control , otra unidad dentro del procesador. [ 5 ]
Microcódigo
La idea básica del microcódigo consiste en reemplazar la lógica de hardware personalizada que implementa la secuencia de instrucciones con una serie de instrucciones simples ejecutadas en un "motor de microcódigo" dentro del procesador. Mientras que un sistema lógico personalizado podría tener una serie de diodos y compuertas que generan una serie de voltajes en varias líneas de control, el motor de microcódigo se conecta a estas líneas, las cuales se activan y desactivan a medida que el motor lee las instrucciones de microcódigo en secuencia. Las instrucciones de microcódigo suelen estar codificadas a nivel de bits en esas líneas; por ejemplo, si el bit 8 es verdadero, podría significar que la ALU debe pausarse a la espera de datos. En este sentido, el microcódigo es similar a los rollos de papel de un piano mecánico , donde los orificios representan qué tecla debe presionarse.
La distinción entre lógica personalizada y microcódigo puede parecer sutil: una utiliza un patrón de diodos y compuertas para decodificar la instrucción y generar una secuencia de señales, mientras que la otra codifica las señales como microinstrucciones que se leen secuencialmente para producir los mismos resultados. La diferencia crucial radica en que, en un diseño de lógica personalizada, cualquier modificación en los pasos individuales requiere rediseñar el hardware. Con el microcódigo, lo único que cambia es el código almacenado en la memoria que lo contiene o en el dispositivo de almacenamiento desde el que se carga en la memoria de control. Esto facilita enormemente la corrección de problemas en un sistema de microcódigo. Además, implica que no existe un límite efectivo para la complejidad de las instrucciones; esta solo está limitada por la cantidad de memoria que se esté dispuesto a utilizar.
La capa más baja en la pila de software de una computadora son tradicionalmente las instrucciones de código máquina sin procesar para el procesador. En los procesadores microcodificados, la obtención, decodificación y ejecución de esas instrucciones se pueden realizar mediante microcódigo. Para evitar confusiones, cada elemento relacionado con el microprograma se diferencia mediante el prefijo "micro" : microinstrucción, microensamblador, microprogramador, etc. [ 6 ]
Los procesadores digitales complejos también pueden emplear más de una unidad de control (posiblemente basada en microcódigo) para delegar subtareas que deben ejecutarse esencialmente de forma asíncrona y en paralelo. Por ejemplo, el VAX 9000 tiene una unidad IBox cableada para obtener y decodificar instrucciones, que luego entrega a una unidad EBox microcodificada para su ejecución, [ 7 ] y el VAX 8800 tiene tanto una IBox microcodificada como una EBox microcodificada. [ 8 ]
Un programador de alto nivel, o incluso un programador de lenguaje ensamblador , normalmente no ve ni modifica el microcódigo. A diferencia del código máquina, que suele conservar cierta compatibilidad con versiones anteriores entre diferentes procesadores de una misma familia, el microcódigo solo se ejecuta en el circuito electrónico exacto para el que fue diseñado, ya que constituye una parte inherente del diseño del procesador en sí.
Diseño
Los ingenieros normalmente escriben el microcódigo durante la fase de diseño de un procesador, almacenándolo en una estructura de memoria de solo lectura (ROM) o matriz lógica programable (PLA) [ 9 ] , o en una combinación de ambas. [ 10 ] Sin embargo, también existen máquinas que tienen parte o la totalidad del microcódigo almacenado en memoria de acceso aleatorio estática (SRAM) o memoria flash . Esto se denomina tradicionalmente almacenamiento de control escribible en el contexto de las computadoras, que puede ser memoria de solo lectura o de lectura y escritura . En este último caso, el proceso de inicialización de la CPU carga el microcódigo en el almacenamiento de control desde otro medio de almacenamiento, con la posibilidad de alterar el microcódigo para corregir errores en el conjunto de instrucciones o para implementar nuevas instrucciones de máquina.
Microprogramas
Los microprogramas consisten en series de microinstrucciones que controlan la CPU a un nivel muy fundamental de los circuitos de hardware. Por ejemplo, una única microinstrucción horizontal típica podría especificar las siguientes operaciones simultáneamente:
- Conecte el registro 1 al lado A de la ALU.
- Conecte el registro 7 al lado B de la ALU.
- Configurar la ALU para realizar sumas en complemento a dos.
- Establezca la entrada de acarreo de la ALU en cero.
- Conecte la salida de la ALU al registro 8.
- Actualizar los códigos de condición a partir de los indicadores de estado de la ALU ( negativo , cero , desbordamiento y acarreo ).
- Microsalto a una dirección μPC determinada para la siguiente microinstrucción.
Para controlar simultáneamente todas las funciones del procesador en un solo ciclo, la microinstrucción suele ser más ancha que 50 bits; por ejemplo, 128 bits en un 360/85 con función de emulador. Los microprogramas se diseñan y optimizan cuidadosamente para lograr la ejecución más rápida posible, ya que un microprograma lento resultaría en una instrucción de máquina lenta y un rendimiento degradado para los programas de aplicación relacionados que utilizan dichas instrucciones.
Justificación
El microcódigo se desarrolló originalmente como un método más sencillo para desarrollar la lógica de control de una computadora. Inicialmente, los conjuntos de instrucciones de la CPU estaban cableados . Cada paso necesario para obtener, decodificar y ejecutar las instrucciones de la máquina (incluidos los cálculos de direcciones de operandos, lecturas y escrituras) se controlaba directamente mediante lógica combinacional y circuitos de máquina de estados secuenciales bastante minimalistas . Si bien estos procesadores cableados eran muy eficientes, la necesidad de conjuntos de instrucciones potentes con direccionamiento de varios pasos y operaciones complejas ( véase más adelante ) dificultaba su diseño y depuración; las instrucciones altamente codificadas y de longitud variable también pueden contribuir a esto, especialmente cuando se utilizan codificaciones muy irregulares.
El microcódigo simplificó el proceso al permitir que gran parte del comportamiento y el modelo de programación del procesador se definieran mediante rutinas de microprogramación en lugar de circuitos dedicados. Incluso en las últimas etapas del diseño, el microcódigo podía modificarse fácilmente, mientras que los diseños de CPU cableados eran muy engorrosos de cambiar. Por lo tanto, esto facilitó enormemente el diseño de la CPU.
Desde la década de 1940 hasta finales de la de 1970, gran parte de la programación se realizaba en lenguaje ensamblador ; las instrucciones de alto nivel implican una mayor productividad del programador, por lo que una ventaja importante del microcódigo fue la relativa facilidad con la que se pueden definir potentes instrucciones de máquina. La máxima expresión de esto son los diseños de "Lenguaje de Alto Nivel Ejecutable Directamente", en los que cada instrucción de un lenguaje de alto nivel como PL/I se ejecuta completa y directamente mediante microcódigo, sin compilación. El proyecto IBM Future Systems y el procesador Data General Fountainhead son ejemplos de esto. Durante la década de 1970, la velocidad de las CPU creció más rápidamente que la de la memoria, y se utilizaron numerosas técnicas, como la transferencia de bloques de memoria , la precarga de memoria y las cachés multinivel, para mitigar este problema. Las instrucciones de máquina de alto nivel, posibles gracias al microcódigo, contribuyeron aún más, ya que un menor número de instrucciones de máquina más complejas requieren menos ancho de banda de memoria. Por ejemplo, una operación sobre una cadena de caracteres se puede realizar como una sola instrucción de máquina, evitando así múltiples búsquedas de instrucciones.
Las arquitecturas con conjuntos de instrucciones implementados mediante microprogramas complejos incluían el IBM System/360 y el VAX de Digital Equipment Corporation . El enfoque de conjuntos de instrucciones cada vez más complejos implementados mediante microcódigo se denominó posteriormente computadora con conjunto de instrucciones complejo (CISC). Un enfoque alternativo, utilizado en muchos microprocesadores , consiste en utilizar una o más matrices lógicas programables (PLA) o memoria de solo lectura (ROM) (en lugar de lógica combinacional) principalmente para la decodificación de instrucciones, y dejar que una máquina de estados simple (con poco o ningún microcódigo) realice la mayor parte de la secuenciación. El MOS Technology 6502 es un ejemplo de un microprocesador que utiliza una PLA para la decodificación y secuenciación de instrucciones. La PLA es visible en las fotomicrografías del chip, [ 11 ] y su funcionamiento puede observarse en la simulación a nivel de transistor .
La microprogramación aún se utiliza en los diseños de CPU modernos. En algunos casos, tras depurar el microcódigo mediante simulación, se sustituye la memoria de control por funciones lógicas. Estas funciones suelen ser más rápidas y económicas que la memoria de microprogramación equivalente.
Beneficios
Los microprogramas de un procesador operan sobre una arquitectura más primitiva, totalmente diferente y mucho más orientada al hardware que las instrucciones de ensamblaje visibles para los programadores convencionales. En coordinación con el hardware, el microcódigo implementa la arquitectura visible para el programador. El hardware subyacente no tiene por qué tener una relación fija con la arquitectura visible. Esto facilita la implementación de una arquitectura de conjunto de instrucciones determinada en una amplia variedad de microarquitecturas de hardware subyacentes.
El IBM System/360 tiene una arquitectura de 32 bits con 16 registros de propósito general, pero la mayoría de las implementaciones del System/360 utilizan hardware que implementa una microarquitectura subyacente mucho más simple; por ejemplo, el System/360 Modelo 30 tiene rutas de datos de 8 bits a la unidad aritmético-lógica (ALU) y a la memoria principal, e implementó los registros de propósito general en una unidad especial de memoria de núcleo de mayor velocidad , y el System/360 Modelo 40 tiene rutas de datos de 8 bits a la ALU y rutas de datos de 16 bits a la memoria principal, e implementó igualmente los registros de propósito general en una unidad especial de memoria de núcleo de mayor velocidad. El Modelo 50 tiene rutas de datos completas de 32 bits e implementa los registros de propósito general en una unidad especial de memoria de núcleo de mayor velocidad. [ 12 ] Los Modelos 65 a 195 tienen rutas de datos más grandes e implementan los registros de propósito general en circuitos de transistores más rápidos. De esta forma, la microprogramación permitió a IBM diseñar numerosos modelos System/360 con hardware sustancialmente diferente y que abarcaban una amplia gama de costes y rendimiento, a la vez que los hacía compatibles arquitectónicamente. Esto reduce drásticamente el número de programas de software de sistema únicos que deben escribirse para cada modelo.
El PDP-11 de Digital Equipment Corporation tiene una arquitectura de 16 bits con ocho registros de propósito general. Se introdujo en 1970 y su arquitectura básica se mantuvo sin cambios durante la década de 1990. Solo la primera máquina de la serie no estaba microcodificada. Entre 1972 y 1976, el ancho del microprograma subyacente del PDP-11 varió de 22 a 64 bits. La longitud del microprograma varió de 256 a 1024 palabras, correspondiendo generalmente los microprogramas más largos a anchos más estrechos. [ 13 ] La variedad de anchos de microprograma implica que hubo al menos siete implementaciones diferentes del PDP-11 en tan solo cuatro años.
Digital Equipment Corporation utilizó un enfoque similar en su familia de ordenadores VAX. Como resultado, los distintos procesadores VAX emplean microarquitecturas diferentes, pero la arquitectura visible para el programador no cambia.
La microprogramación también reduce el coste de las modificaciones en campo para corregir defectos ( errores ) en el procesador; a menudo, un error se puede solucionar reemplazando una parte del microprograma en lugar de realizar cambios en la lógica y el cableado del hardware.
Historia
Primeros ejemplos
La computadora ACE, diseñada por Alan Turing en 1946, utilizaba microprogramación. [ 14 ]
En 1947, el diseño del MIT Whirlwind introdujo el concepto de memoria de control como una forma de simplificar el diseño de computadoras y superar los métodos ad hoc . La memoria de control es una matriz de diodos : una red bidimensional, donde una dimensión recibe "pulsos de tiempo de control" del reloj interno de la CPU, y la otra se conecta a las señales de control en las compuertas y otros circuitos. Un "distribuidor de pulsos" toma los pulsos generados por el reloj de la CPU y los divide en ocho pulsos de tiempo separados, cada uno de los cuales activa una fila diferente de la red. Cuando se activa la fila, activa las señales de control conectadas a ella. [ 15 ]
En 1951, Maurice Wilkes [ 16 ] mejoró este concepto añadiendo la ejecución condicional , un concepto similar a una condición en el software informático. Su implementación inicial consistía en un par de matrices: la primera generaba señales al estilo del almacén de control Whirlwind, mientras que la segunda seleccionaba qué fila de señales (la palabra de instrucción del microprograma, por así decirlo) invocar en el siguiente ciclo. Las condiciones se implementaban proporcionando una forma de que una sola línea en el almacén de control pudiera elegir entre alternativas en la segunda matriz. Esto hacía que las señales de control dependieran de la señal interna detectada. Wilkes acuñó el término microprogramación para describir esta característica y distinguirla de un simple almacén de control.
El 360
El microcódigo seguía siendo relativamente raro en el diseño de computadoras, ya que el costo de la ROM necesaria para almacenar el código no era significativamente diferente del costo de la lógica de control personalizada. Esto cambió a principios de la década de 1960 con la introducción de la memoria de núcleos y la memoria de núcleos en serie producidas en masa , que eran mucho menos costosas que la lógica dedicada basada en matrices de diodos o soluciones similares. El primero en aprovechar esto realmente fue IBM en su serie System/360 de 1964. Esto permitió que las máquinas tuvieran un conjunto de instrucciones muy complejo, incluyendo operaciones que coincidían con construcciones de lenguajes de alto nivel, como formatear valores binarios como cadenas decimales, codificando la compleja serie de pasos internos necesarios para esta tarea en memoria de bajo costo. [ 17 ]
Pero el verdadero valor de la línea 360 radicaba en la posibilidad de construir una serie de máquinas internamente completamente diferentes, pero que ejecutaran la misma arquitectura de conjunto de instrucciones (ISA). Para una máquina de gama baja, se podría usar una ALU de 8 bits que requiere múltiples ciclos para completar una sola suma de 32 bits, mientras que una máquina de gama alta podría tener una ALU completa de 32 bits que realiza la misma suma en un solo ciclo. Estas diferencias podrían implementarse en la lógica de control, pero el costo de implementar un decodificador completamente diferente para cada máquina sería prohibitivo. El uso de microcódigo implicaba que lo único que cambiaba era el código en la ROM. Por ejemplo, una máquina podría incluir una unidad de punto flotante ( FPU), por lo que su microcódigo para multiplicar dos números podría tener solo unas pocas líneas, mientras que en la misma máquina sin la FPU, este sería un programa que realizaría la misma operación mediante múltiples sumas, y lo único que cambiaría sería la ROM. [ 17 ]
El resultado de este diseño fue que los clientes podían usar un modelo básico de la familia para desarrollar su software, sabiendo que si alguna vez necesitaban mayor rendimiento, podían actualizar a una versión más rápida sin que nada más cambiara. Esto redujo las barreras de entrada y el 360 fue un éxito rotundo. A finales de la década, el uso de microcódigo era imprescindible en toda la industria de los mainframes.
Avanzando en la fila
Las primeras minicomputadoras eran demasiado simples para requerir microcódigo y se parecían más a las primeras computadoras centrales en cuanto a sus conjuntos de instrucciones y la forma en que se decodificaban. Pero no pasó mucho tiempo antes de que sus diseñadores comenzaran a usar circuitos integrados más potentes que permitían conjuntos de instrucciones más complejos. A mediados de la década de 1970, la mayoría de las nuevas minicomputadoras y superminicomputadoras también usaban microcódigo, como la mayoría de los modelos de la PDP-11 y, sobre todo, la mayoría de los modelos de la VAX , que incluían instrucciones de alto nivel similares a las que se encontraban en la 360. [ 18 ]
La misma evolución básica se produjo también con los microprocesadores . Los primeros diseños eran extremadamente simples, e incluso los diseños de 8 bits más potentes de mediados de la década de 1970, como el Zilog Z80, tenían conjuntos de instrucciones lo suficientemente simples como para implementarse en lógica dedicada. Para entonces, la lógica de control podía integrarse en el mismo chip que la CPU, lo que hacía que la diferencia de coste entre la ROM y la lógica fuera menos problemática. Sin embargo, no pasó mucho tiempo antes de que estas empresas también se enfrentaran al problema de introducir diseños de mayor rendimiento sin dejar de ofrecer retrocompatibilidad . Entre los primeros ejemplos de microcódigo en microprocesadores se encontraba el Intel 8086. [ 5 ]
Entre las implementaciones más avanzadas de microcódigo en microprocesadores se encuentra el Motorola 68000. Este ofrecía un conjunto de instrucciones altamente ortogonal con una amplia variedad de modos de direccionamiento , todos implementados en microcódigo. Esto no estuvo exento de costos; según artículos iniciales, alrededor del 20 % de la superficie del chip (y, por lo tanto, de su costo) correspondía al sistema de microcódigo [ 19 ], y estimaciones posteriores sugieren que aproximadamente 23 000 de los 68 000 transistores del procesador formaban parte de dicho sistema.
RISC entra
Mientras las empresas seguían compitiendo en la complejidad de sus conjuntos de instrucciones, y el uso de microcódigo para implementarlos era indiscutible, a mediados de la década de 1970 un proyecto interno de IBM planteó serias dudas sobre todo el concepto. Como parte de un proyecto para desarrollar una centralita telefónica totalmente digital de alto rendimiento , un equipo liderado por John Cocke comenzó a examinar enormes volúmenes de datos de rendimiento de los programas 360 (y System/370 ) de sus clientes . Esto les llevó a observar un patrón curioso: cuando el conjunto de instrucciones presentaba múltiples versiones de una instrucción, el compilador casi siempre utilizaba la más simple, en lugar de la que representaba el código de forma más directa. Descubrieron que esto se debía a que esas instrucciones siempre se implementaban en hardware y, por lo tanto, se ejecutaban más rápido. El uso de la otra instrucción podría ofrecer un mayor rendimiento en algunas máquinas, pero no había forma de saber en qué máquina se ejecutaban. Esto frustraba el propósito original del uso de microcódigo, que era ocultar estas distinciones. [ 20 ]
El equipo llegó a una conclusión radical: "Imponer microcódigo entre una computadora y sus usuarios impone una sobrecarga costosa en la ejecución de las instrucciones más frecuentemente ejecutadas". [ 20 ]
El resultado de este descubrimiento fue lo que hoy se conoce como el concepto RISC . El complejo motor de microcódigo y su ROM asociada se reducen o eliminan por completo, y esos circuitos se dedican a funciones como registros adicionales o una ALU más amplia, lo que aumenta el rendimiento de cada programa. Cuando se necesitan secuencias complejas de instrucciones, esto se deja al compilador, que es precisamente la razón de ser de un compilador. El concepto básico pronto fue adoptado por investigadores universitarios en California, donde las simulaciones sugirieron que estos diseños superarían con creces incluso a los diseños convencionales más rápidos. Fue uno de estos proyectos, en la Universidad de California, Berkeley , el que introdujo el término RISC.
La industria respondió al concepto de RISC con confusión y hostilidad, incluyendo un famoso artículo despectivo del equipo VAX en Digital. [ 21 ] Un punto importante de controversia fue que implementar las instrucciones fuera del procesador significaba que este dedicaría mucho más tiempo a leerlas desde la memoria, lo que ralentizaría el rendimiento general sin importar la velocidad de la CPU. [ 21 ] Los defensores señalaron que las simulaciones mostraban claramente que el número de instrucciones no era mucho mayor, especialmente al considerar el código compilado. [ 20 ]
El debate se prolongó hasta que surgieron los primeros diseños RISC comerciales en la segunda mitad de la década de 1980, que superaron fácilmente a los diseños más complejos de otras compañías. A finales de la década de 1980, el debate terminó; incluso DEC estaba abandonando el microcódigo para sus diseños DEC Alpha , y los procesadores CISC pasaron a utilizar circuitos cableados, en lugar de microcódigo, para realizar muchas funciones. Por ejemplo, el Intel 80486 utiliza circuitos cableados para buscar y decodificar instrucciones, utilizando microcódigo solo para ejecutarlas; las instrucciones de movimiento de registro a registro y las aritméticas requerían solo una microinstrucción, lo que permitía completarlas en un ciclo de reloj. [ 22 ] El hardware de búsqueda y decodificación del Pentium Pro busca instrucciones y las decodifica en series de microoperaciones que se pasan a la unidad de ejecución, que programa y ejecuta las microoperaciones, posiblemente haciéndolo fuera de orden . Las instrucciones complejas se implementan mediante microcódigo que consiste en secuencias predefinidas de microoperaciones. [ 23 ]
Algunos diseños de procesadores utilizan código máquina que se ejecuta en un modo especial, con instrucciones especiales, disponibles solo en ese modo, que tienen acceso al hardware dependiente del procesador, para implementar algunas características de bajo nivel del conjunto de instrucciones. El DEC Alpha, un diseño RISC puro, utilizó PALcode para implementar características como el manejo de fallos del búfer de búsqueda de traducción (TLB) y el manejo de interrupciones, [ 24 ] además de proporcionar, para sistemas basados en Alpha que ejecutan OpenVMS , instrucciones que requieren acceso a memoria interbloqueada que son similares a las instrucciones proporcionadas por la arquitectura VAX . [ 24 ] Las CPU CMOS IBM System/390 , comenzando con el procesador G4, y las CPU z/Architecture utilizan millicode para implementar algunas instrucciones. [ 25 ]
Ejemplos
- La máquina analítica ideada por Charles Babbage utiliza clavijas insertadas en tambores giratorios para almacenar sus procedimientos internos.
- Se dice que el EMIDEC 1100 [ 26 ] utiliza un sistema de control cableado que consiste en cables enhebrados a través de núcleos de ferrita, conocidos como "los cordones".
- La mayoría de los modelos de la serie IBM System/360 están microprogramados:
- El modelo 25 es único entre los modelos System/360 por usar los 16 K bytes superiores de la memoria principal para almacenar la memoria de control del microprograma. El 2025 utiliza una microarquitectura de 16 bits con siete palabras de control (o microinstrucciones). Después del mantenimiento del sistema o al cambiar el modo de operación, el microcódigo se carga desde el lector de tarjetas, la cinta u otro dispositivo. [ 27 ] La emulación del IBM 1410 para este modelo se carga de esta manera.
- El modelo 30 utiliza una microarquitectura de 8 bits con solo unos pocos registros de hardware; todo lo que veía el programador es emulado por el microprograma. El microcódigo para este modelo también se almacena en tarjetas perforadas especiales, que se guardan dentro de la máquina en un lector dedicado por tarjeta, llamadas unidades "CROS" (almacenamiento de solo lectura con condensador). [ 28 ] : 2–5 Se añade otra unidad CROS para las máquinas solicitadas con emulación 1401/1440/1460 [ 28 ] : 4–29 y para las máquinas solicitadas con emulación 1620. [ 28 ] : 4–75
- El modelo 40 utiliza palabras de control de 56 bits. La unidad 2040 implementa tanto el procesador principal del System/360 como el canal multiplex (el procesador de E/S). Este modelo utiliza lectores dedicados TROS similares a las unidades CROS , pero con un sistema de captación inductiva (Transformer Read-only Store).
- El modelo 50 cuenta con dos rutas de datos internas que operan en paralelo: una ruta de datos de 32 bits utilizada para operaciones aritméticas y una ruta de datos de 8 bits utilizada para algunas operaciones lógicas. La memoria de control utiliza microinstrucciones de 90 bits.
- El modelo 85 cuenta con unidades de búsqueda de instrucciones (unidad I) y de ejecución (unidad E) independientes para ofrecer un alto rendimiento. La unidad I está controlada por hardware. La unidad E está microprogramada; las palabras de control tienen un ancho de 108 bits en un modelo 360/85 básico, y de mayor ancho si se instala una función de emulador.
- El NCR 315 está microprogramado con núcleos de ferrita cableados a mano (una ROM ) que reciben pulsos de un secuenciador con ejecución condicional. Los cables que atraviesan los núcleos están habilitados para diversos elementos lógicos y de datos en el procesador.
- Los procesadores PDP-9 , KL10 y KS10 de Digital Equipment Corporation , así como los procesadores PDP-11 , con excepción del PDP-11/20, son microprogramados. [ 29 ]
- La mayoría de los miniordenadores Data General Eclipse están microprogramados. La tarea de escribir microcódigo para el Eclipse MV/8000 se detalla en el libro ganador del Premio Pulitzer titulado El alma de una nueva máquina .
- Muchos sistemas de Burroughs están microprogramados:
- El microprocesador B700 ejecuta códigos de operación a nivel de aplicación mediante secuencias de microinstrucciones de 16 bits almacenadas en la memoria principal; cada una de estas microinstrucciones consiste en una operación de carga de registro o se asigna a una instrucción de nanocódigo de 56 bits almacenada en memoria de solo lectura. Esto permite que un hardware relativamente sencillo funcione como controlador periférico de un ordenador central o se integre como un ordenador independiente.
- El B1700 se implementa con un hardware radicalmente diferente, que incluye memoria principal direccionable por bits, pero presenta una organización multicapa similar. El sistema operativo precarga el intérprete para el lenguaje requerido. Estos intérpretes ofrecen diferentes máquinas virtuales para COBOL , Fortran , etc.
- Microdata fabrica ordenadores en los que el microcódigo es accesible para el usuario; esto permite la creación de instrucciones personalizadas a nivel de ensamblador. El sistema operativo Reality de Microdata aprovecha ampliamente esta capacidad.
- La estación de trabajo Xerox Alto utilizaba un diseño basado en microcódigo, pero, a diferencia de muchos ordenadores, el motor de microcódigo no estaba oculto al programador en un diseño por capas. Las aplicaciones aprovechaban esta característica para acelerar el rendimiento.
- El IBM System/38 se describe como un sistema con microcódigo tanto horizontal como vertical . [ 30 ] En la práctica, el procesador implementa una arquitectura de conjunto de instrucciones denominada Interfaz Microprogramada Interna (IMPI) mediante un formato de microcódigo horizontal. La denominada capa de microcódigo vertical implementa el conjunto de instrucciones de Interfaz de Máquina (MI) independiente del hardware del System/38, traduciendo el código MI a código IMPI y ejecutándolo. Antes de la introducción de la línea de procesadores IBM RS64 , los primeros sistemas IBM AS/400 utilizaban la misma arquitectura. [ 31 ]
- El coprocesador de realidad (RCP) de Nintendo 64 , que funciona como unidad de procesamiento gráfico y procesador de audio de la consola, utiliza microcódigo; es posible implementar nuevos efectos o ajustar el procesador para lograr el resultado deseado. Algunos ejemplos notables de microcódigo RCP personalizado incluyen los gráficos de alta resolución, los motores de partículas y las distancias de renderizado ilimitadas que se encuentran en Indiana Jones and the Infernal Machine , Star Wars: Rogue Squadron y Star Wars: Battle for Naboo de Factor 5 ; [ 32 ] [ 33 ] y la reproducción de vídeo de movimiento completo que se encuentra en Resident Evil 2 de Angel Studios . [ 34 ]
- Las unidades vectoriales VU0 y VU1 de la Sony PlayStation 2 son microprogramables; de hecho, a VU1 solo se puede acceder mediante microcódigo en las primeras generaciones del SDK.
- Los MicroCore Labs MCL86 (archivado el 3 de noviembre de 2016 ) , MCL51 (archivado el 2 de febrero de 2017 ) y MCL65 (archivado el 21 de diciembre de 2018 ) son ejemplos de implementaciones de microsecuenciadores "verticales" altamente codificados de los procesadores Intel 8086/8088, 8051 y MOS 6502.
- El sistema informático Meta 4 Series 16 de Digital Scientific Corporation era un sistema microprogramable por el usuario disponible por primera vez en 1970. El microcódigo tenía un estilo principalmente vertical con microinstrucciones de 32 bits. [ 35 ] Las instrucciones se almacenaban en placas de programa reemplazables con una cuadrícula de posiciones de bits. Los bits de uno (1) se representaban mediante pequeños cuadrados metálicos detectados por amplificadores, y los bits de cero (0) mediante la ausencia de los cuadrados. [ 36 ] El sistema podía configurarse con hasta 4K palabras de 16 bits de microalmacenamiento. Uno de los productos de Digital Scientific era un emulador para el IBM 1130. [ 37 ] [ 38 ]
- El MCP-1600 es un microprocesador fabricado por Western Digital desde 1975 hasta principios de la década de 1980. Se utilizó para implementar tres arquitecturas de computadora diferentes en microcódigo: el Pascal MicroEngine , el WD16 y el DEC LSI-11 , una versión de menor costo del PDP-11. [ 39 ]
- La mayoría de los procesadores x86 están microcodificados, utilizando microcódigo para implementar algunas o todas las operaciones. [ 40 ] [ 41 ] Los procesadores x86 implementaron microcódigo parcheable (parcheado por BIOS o sistema operativo ) desde la microarquitectura Intel P6 , la microarquitectura AMD K8 y la microarquitectura Via Isaiah [ 42 ] . La microarquitectura AMD K7 admite la carga de parches de microcódigo, sin embargo, AMD nunca lanzó parches y los parches de microcódigo no son compatibles oficialmente debido a la falta de pruebas en BIST [ 43 ] . Dichos procesadores implementaron ROM de microcódigo y SRAM de parches de microcódigo en su silicio.
- Muchos adaptadores gráficos , controladores de interfaz de red y adaptadores de host utilizan microcódigo. Las primeras tarjetas de expansión ISA suelen tener el código integrado; con la llegada de los buses PCI , AGP y, posteriormente , PCIe , las tarjetas de expansión más recientes pueden implementar microcódigo modificable .
Implementación
Cada microinstrucción en un microprograma proporciona los bits que controlan los elementos funcionales que componen internamente una CPU. La ventaja sobre una CPU cableada es que el control interno de la CPU se convierte en una forma especializada de programa informático. De este modo, el microcódigo transforma un complejo desafío de diseño electrónico (el control de una CPU) en un desafío de programación menos complejo. Para aprovechar esto, una CPU se divide en varias partes:
- Una unidad I puede decodificar instrucciones en el hardware y determinar la dirección del microcódigo para procesar la instrucción en paralelo con la unidad E.
- Un microsecuenciador selecciona la siguiente palabra del registro de control. Un secuenciador es principalmente un contador, pero también suele tener algún mecanismo para saltar a una parte diferente del registro de control en función de ciertos datos, generalmente datos del registro de instrucciones y siempre alguna parte del registro de control. El secuenciador más simple es simplemente un registro cargado con algunos bits del registro de control.
- Un conjunto de registros es una memoria rápida que contiene los datos de la unidad central de procesamiento. Puede incluir registros visibles para los programas de aplicación, como los registros de propósito general y el contador de programa , y también otros registros que no son fácilmente accesibles para el programador. A menudo, el conjunto de registros es un archivo de registros de triple puerto ; es decir, se pueden leer dos registros y escribir un tercero simultáneamente.
- Una unidad aritmético-lógica realiza cálculos, generalmente sumas, negaciones lógicas, desplazamientos a la derecha y operaciones AND lógicas. A menudo también realiza otras funciones.
También puede haber un registro de direcciones de memoria y un registro de datos de memoria , utilizados para acceder al almacenamiento principal de la computadora . Juntos, estos elementos forman una " unidad de ejecución ". La mayoría de las CPU modernas tienen varias unidades de ejecución. Incluso las computadoras simples suelen tener una unidad para leer y escribir en la memoria, y otra para ejecutar el código del usuario. Estos elementos a menudo se pueden integrar en un solo chip. Este chip viene en un ancho fijo que formaría una "sección" a través de la unidad de ejecución. Estos se conocen como chips de " sección de bits ". La familia AMD Am2900 es uno de los ejemplos más conocidos de elementos de sección de bits. [ 44 ] Las partes de las unidades de ejecución y las unidades de ejecución completas están interconectadas por un conjunto de cables llamado bus .
Los programadores desarrollan microprogramas utilizando herramientas de software básicas. Un microensamblador permite definir la tabla de bits simbólicamente. Debido a su estrecha relación con la arquitectura subyacente, el microcódigo posee varias propiedades que dificultan su generación mediante un compilador. [ 1 ] Un programa simulador está diseñado para ejecutar los bits de la misma manera que la electrónica y ofrece mayor libertad para depurar el microprograma. Una vez finalizado y probado exhaustivamente, el microprograma se utiliza a veces como entrada para un programa informático que construye la lógica necesaria para producir los mismos datos. Este programa es similar a los utilizados para optimizar una matriz lógica programable . Incluso sin una lógica totalmente óptima, la lógica optimizada heurísticamente puede reducir considerablemente el número de transistores necesarios para una memoria de control de solo lectura (ROM). Esto reduce el coste de producción y el consumo eléctrico de la CPU.
El microcódigo se puede clasificar como horizontal o vertical , dependiendo principalmente de si cada microinstrucción controla elementos de la CPU con poca o ninguna decodificación (microcódigo horizontal) [ a ] o si requiere una decodificación extensa mediante lógica combinacional antes de hacerlo (microcódigo vertical). En consecuencia, cada microinstrucción horizontal es más ancha (contiene más bits) y ocupa más espacio de almacenamiento que una microinstrucción vertical.
Microcódigo horizontal
El microcódigo horizontal consta de varias microoperaciones discretas que se combinan en una única microinstrucción para su ejecución simultánea. [ 1 ] El microcódigo horizontal suele estar almacenado en una memoria de control bastante amplia; no es raro que cada palabra tenga 108 bits o más. En cada ciclo del reloj del secuenciador, se lee, decodifica y utiliza una palabra de microcódigo para controlar los elementos funcionales que componen la CPU.
En una implementación típica, una palabra de microprograma horizontal comprende grupos de bits bastante bien definidos. Por ejemplo, una disposición simple podría ser:
Para que este tipo de micromáquina implemente una instrucción JUMP con la dirección después del código de operación, el microcódigo podría requerir dos ciclos de reloj. El ingeniero que la diseñe escribiría un código fuente en microensamblador similar a este:
# Cualquier línea que comience con un signo de número es un comentario # Esto es solo una etiqueta, la forma habitual en que los ensambladores representan simbólicamente una # dirección de memoria. InstructionJUMP : # Para prepararse para la siguiente instrucción, el microcódigo de decodificación de instrucciones ya ha # movido el contador de programa al registro de direcciones de memoria. Esta instrucción obtiene # la dirección de destino de la instrucción de salto de la palabra de memoria que sigue al # código de operación de salto, copiando del registro de datos de memoria al registro de direcciones de memoria. # Esto le da al sistema de memoria dos ciclos de reloj para obtener la siguiente # instrucción al registro de datos de memoria para que la use la decodificación de instrucciones. # La instrucción del secuenciador "next" significa simplemente sumar 1 a la dirección de la palabra de control. MDR , NONE , MAR , COPY , NEXT , NONE # Esto coloca la dirección de la siguiente instrucción en el PC. # Esto le da al sistema de memoria un ciclo de reloj para terminar la obtención iniciada en la # microinstrucción anterior. # La instrucción del secuenciador es saltar al inicio de la decodificación de instrucciones. MAR , 1 , PC , ADD , JMP , InstructionDecode # La decodificación de la instrucción no se muestra, porque suele ser un lío, muy particular # del procesador exacto que se está emulando. Incluso este ejemplo está simplificado. # Muchas CPU tienen varias formas de calcular la dirección, en lugar de simplemente obtenerla # de la palabra que sigue al código de operación. Por lo tanto, en lugar de una sola # instrucción de salto, esas CPU tienen una familia de instrucciones de salto relacionadas.En cada ciclo, es común observar que solo se utilizan algunas partes de la CPU, mientras que los grupos de bits restantes en la microinstrucción no realizan ninguna operación. Con un diseño cuidadoso del hardware y el microcódigo, esta propiedad puede aprovecharse para paralelizar operaciones que utilizan diferentes áreas de la CPU; por ejemplo, en el caso anterior, la ALU no se requiere durante el primer ciclo, por lo que podría utilizarse para completar una instrucción aritmética anterior.
Microcódigo vertical
En el microcódigo vertical, cada microinstrucción se codifica de forma significativa; es decir, los campos de bits generalmente pasan por una lógica combinacional intermedia que, a su vez, genera las señales de control y secuenciación para los elementos internos de la CPU (ALU, registros, etc.). Esto contrasta con el microcódigo horizontal, en el que los campos de bits producen directamente las señales de control y secuenciación o se codifican mínimamente. En consecuencia, el microcódigo vertical requiere instrucciones más cortas y menos almacenamiento, pero requiere más tiempo para decodificarse, lo que resulta en una menor frecuencia de reloj de la CPU. [ 45 ]
Algunos microcódigos verticales son simplemente el lenguaje ensamblador de una computadora convencional simple que emula una computadora más compleja. Algunos procesadores, como los procesadores DEC Alpha y los microprocesadores CMOS de las computadoras centrales IBM System/390 y z/Architecture posteriores , utilizan código máquina, ejecutándose en un modo especial que le da acceso a instrucciones especiales, registros especiales y otros recursos de hardware no disponibles para el código máquina regular, para implementar algunas instrucciones y otras funciones, [ 46 ] [ 47 ] como recorridos de tablas de páginas en los procesadores Alpha. [ 48 ] Esto se llama PALcode en los procesadores Alpha y millicode en los procesadores de computadoras centrales IBM.
Otra forma de microcódigo vertical tiene dos campos:
La selección de campo determina qué parte de la CPU será controlada por esta palabra del almacén de control. El valor del campo controla esa parte de la CPU. Con este tipo de microcódigo, el diseñador opta explícitamente por crear una CPU más lenta para ahorrar dinero reduciendo los bits no utilizados en el almacén de control; sin embargo, la menor complejidad puede aumentar la frecuencia de reloj de la CPU, lo que disminuye el efecto de un mayor número de ciclos por instrucción.
A medida que los transistores se abarataron, el microcódigo horizontal pasó a dominar el diseño de las CPU que utilizaban microcódigo, mientras que el microcódigo vertical se utilizó con menos frecuencia.
Cuando se utilizan microcódigos tanto verticales como horizontales, el microcódigo horizontal puede denominarse nanocódigo o picocódigo . [ 49 ]
Almacén de control modificable
Se construyeron algunos ordenadores utilizando microcódigo grabable . En este diseño, en lugar de almacenar el microcódigo en la ROM o en lógica cableada, el microcódigo se almacena en una RAM denominada memoria de control grabable o WCS . A este tipo de ordenador se le denomina a veces ordenador con conjunto de instrucciones grabable (WISC). [ 50 ]
Muchos prototipos de computadoras experimentales utilizan memorias de control grabables ; también existen máquinas comerciales que utilizan microcódigo grabable, como los sistemas Burroughs Small , las primeras estaciones de trabajo Xerox , la familia DEC VAX 8800 ( Nautilus ), las máquinas Symbolics L y G, varias implementaciones de IBM System/360 y System/370 , algunas máquinas DEC PDP-10 , [ 51 ] y el Data General Eclipse MV/8000 . [ 52 ]
El IBM System/370 incluye una función llamada Initial-Microprogram Load ( IML o IMPL ) [ 53 ] que se puede invocar desde la consola, como parte del reinicio al encender ( POR ) o desde otro procesador en un complejo multiprocesador estrechamente acoplado .
Algunas máquinas comerciales, por ejemplo IBM 360/85, [ 54 ] [ 55 ] tienen tanto un almacenamiento de solo lectura como un almacenamiento de control escribible para microcódigo.
WCS ofrece varias ventajas, entre ellas la facilidad para modificar el microprograma y, para ciertas generaciones de hardware, un acceso más rápido que el que proporcionan las ROM. La programación de WCS por parte del usuario permite optimizar la máquina para fines específicos.
A partir del Pentium Pro en 1995, varias CPU x86 tienen microcódigo Intel escribible . [ 56 ] [ 57 ] Esto, por ejemplo, ha permitido corregir errores en los microcódigos de Intel Core 2 e Intel Xeon parcheando sus microprogramas, en lugar de tener que reemplazar los chips completos. Un segundo ejemplo destacado es el conjunto de parches de microcódigo que Intel ofreció para algunas de sus arquitecturas de procesadores de hasta 10 años de antigüedad, en un intento por contrarrestar las vulnerabilidades de seguridad descubiertas en sus diseños —Spectre y Meltdown— que se hicieron públicas a principios de 2018. [ 58 ] [ 59 ] Una actualización de microcódigo puede ser instalada por Linux, [ 60 ] FreeBSD , [ 61 ] Microsoft Windows, [ 62 ] o la BIOS de la placa base. [ 63 ]
Algunas máquinas ofrecen como opción memorias de control programables y grabables por el usuario, incluidas las minicomputadoras HP 2100 , DEC PDP-11/60 , TI-990 /12, [ 64 ] [ 65 ] y Varian Data Machines serie V-70 . Las opciones de WCS también se extendieron a los microprocesadores. El DEC LSI-11 tiene una opción que permite programar la micromáquina interna de 8 bits para crear extensiones específicas de la aplicación al conjunto de instrucciones. [ 66 ]
Algunos periféricos y adaptadores de microcódigo disponen de microcódigo editable, que normalmente es cargado por un controlador de dispositivo del sistema operativo. Dicho microcódigo se carga en la memoria SRAM o DRAM del dispositivo , por ejemplo, la memoria GDDR SDRAM de una tarjeta gráfica.
Comparación con VLIW y RISC
La tendencia de diseño hacia procesadores con gran cantidad de microcódigo e instrucciones complejas comenzó a principios de la década de 1960 y continuó hasta mediados de la década de 1980 aproximadamente. En ese momento, la filosofía de diseño RISC comenzó a adquirir mayor relevancia.
Una CPU que utiliza microcódigo generalmente tarda varios ciclos de reloj en ejecutar una sola instrucción, un ciclo de reloj por cada paso del microprograma correspondiente. Algunos procesadores CISC incluyen instrucciones cuya ejecución puede ser muy lenta. Estas variaciones afectan tanto a la latencia de las interrupciones como, lo que es mucho más importante en los sistemas modernos, a la segmentación de instrucciones (pipelining ).
Al diseñar un nuevo procesador, un RISC con control cableado presenta las siguientes ventajas sobre un CISC con control microcodificado:
- La programación se ha alejado en gran medida del nivel de ensamblador, por lo que ya no merece la pena proporcionar instrucciones complejas por motivos de productividad.
- Los conjuntos de instrucciones más sencillos permiten la ejecución directa por parte del hardware, evitando la penalización de rendimiento que supone la ejecución mediante microcódigo.
- Los análisis demuestran que las instrucciones complejas se utilizan con poca frecuencia, por lo que los recursos de la máquina dedicados a ellas se desperdician en gran medida.
- Los recursos de la máquina dedicados a instrucciones complejas que se utilizan con poca frecuencia se aprovechan mejor para acelerar la ejecución de instrucciones más sencillas y de uso común.
- Las instrucciones microcodificadas complejas pueden requerir muchos ciclos de reloj variables y son difíciles de segmentar para mejorar el rendimiento.
También existen argumentos en contra:
- Las instrucciones complejas en implementaciones con mucho microcódigo pueden no requerir muchos recursos adicionales de la máquina, salvo el espacio del microcódigo. Por ejemplo, la misma ALU se suele usar para calcular una dirección efectiva y para computar el resultado a partir de los operandos, como en los procesadores Z80 , 8086 y otros.
- Las instrucciones no RISC más sencillas (es decir, las que utilizan operandos de memoria directa ) son frecuentemente empleadas por los compiladores modernos. Incluso las operaciones aritméticas de memoria directa a pila (es decir, de resultado en memoria) se utilizan habitualmente. Si bien estas operaciones de memoria, a menudo con codificaciones de longitud variable, son más difíciles de segmentar, sigue siendo totalmente factible, como lo demuestran claramente los procesadores i486 , AMD K5 , Cyrix 6x86 , Motorola 68040 , etc.
- Las instrucciones que no son RISC realizan inherentemente más trabajo por instrucción (en promedio) y, además, suelen estar altamente codificadas, lo que permite un tamaño total menor del mismo programa y, por lo tanto, un mejor uso de las memorias caché limitadas.
Muchos procesadores RISC y VLIW están diseñados para ejecutar todas las instrucciones (siempre que estén en la caché) en un solo ciclo. Esto es muy similar a cómo las CPU con microcódigo ejecutan una microinstrucción por ciclo. Los procesadores VLIW tienen instrucciones que se comportan de forma similar a un microcódigo horizontal muy amplio, aunque normalmente sin el control tan preciso sobre el hardware que proporciona el microcódigo. Las instrucciones RISC a veces se asemejan al microcódigo vertical estrecho.
Microoperaciones
Las implementaciones CISC modernas, como la familia x86 que comienza con el NexGen Nx586, el Intel Pentium Pro y el AMD K5 , decodifican las instrucciones en microoperaciones con búfer dinámico mediante una codificación de instrucciones similar a la de RISC o al microcódigo tradicional. Una unidad de decodificación de instrucciones cableada emite directamente microoperaciones para las instrucciones x86 comunes, pero recurre a una ROM de microcódigo más tradicional que contiene microoperaciones para las instrucciones más complejas o de uso poco frecuente. [ 2 ]
Por ejemplo, un procesador x86 podría buscar microoperaciones en el microcódigo para manejar operaciones complejas de varios pasos, como instrucciones de bucle o de cadena, funciones trascendentales de unidades de punto flotante o valores inusuales como números desnormalizados , e instrucciones de propósito especial como CPUID .
Significados alternativos de "microcódigo"
PDP-8
La PDP-8 es una familia de minicomputadoras de 12 bits lanzada por Digital Equipment Corporation en 1965. Se decía que la instrucción OPR (OPeRate) estaba "microcodificada". Esto no significaba lo que significa hoy en día, sino que cada bit de la palabra de instrucción especificaba una acción determinada, y el programador podía realizar varias acciones en un solo ciclo de instrucción configurando múltiples bits. Algunos ejemplos de estas acciones son: borrar el acumulador, complementar el acumulador, rotar a la derecha, rotar a la derecha dos veces e intercambiar bytes.
Firmware integrado
Algunos proveedores de hardware, en particular IBM y Lenovo , utilizan el término microcódigo indistintamente con firmware integrado . En este contexto, todo el código dentro de un dispositivo se denomina microcódigo, ya sea microcódigo o código máquina. Por ejemplo, las actualizaciones del microcódigo de una unidad de disco duro pueden abarcar actualizaciones tanto de su microcódigo como de su firmware. [ 67 ] El firmware integrado ha sido popular en procesadores específicos de aplicaciones como procesadores de red , procesadores de señales digitales , controladores de canal , controladores de disco , controladores de interfaz de red , controladores de memoria flash , unidades de procesamiento gráfico y en otro hardware.
Véase también
Notas
- ↑ Los procesadores microcodificados horizontalmente de IBM tenían múltiples microórdenes y campos de selección de registro que requerían decodificación.
Referencias
- 1 2 3 Kent, Allen; Williams, James G. (5 de abril de 1993). Enciclopedia de Ciencias de la Computación y Tecnología: Volumen 28 - Suplemento 13. Nueva York: Marcel Dekker, Inc. pág. 34. ISBN 978-0-8247-2281-4Archivado del original el 20/11/2016 . Consultado el 17/01/2016 .
- 1 2 Fog, Agner (2017-05-02). La microarquitectura de las CPU de Intel, AMD y VIA (PDF) (Informe). Universidad Técnica de Dinamarca. Archivado (PDF) del original el 28-03-2017 . Recuperado el 21-08-2024 .
- 1 2 Ambos, David (23 de julio de 2020). "La unidad central de procesamiento (CPU): sus componentes y funcionalidad" . Red Hat .
- ↑ Pickens, John. "Códigos de operación NMOS 6502" . 6502.org .
- 1 2 Shirriff, Ken. "Cómo funciona el motor de microcódigo del procesador 8086" . Blog de Ken Shirriff .
- ↑ "ISO/IEC/IEEE 24765:2017(en) Ingeniería de sistemas y software — Vocabulario" . www.iso.org . Consultado el 23 de junio de 2024 .
- ↑ Descripción técnica del sistema VAX 9000 (PDF) . Digital Equipment Corporation . Mayo de 1990. págs. 3-5 – 3-32 . EK-KA90S-TD-001.
- ↑ Descripción técnica del sistema VAX 8800 Volumen 2 (PDF) . Digital Equipment Corporation . Julio de 1986. EK-KA882-TD-PRE.
- ↑ Manning, BM; Mitby, JS; Nicholson, JO (noviembre de 1979). "Procesador microprogramado con memoria de control PLA" . Boletín de divulgación técnica de IBM . 22 (6). Archivado del original el 1 de octubre de 2012. Recuperado el 10 de julio de 2011 .
- ↑ A menudo se denomina memoria de control ROM/PLA en el contexto de su uso en una CPU; Supnik, Bob (24 de febrero de 2008). "J-11: el cuarto y último diseño de microprocesador PDP-11 de DEC... incluye... memoria de control ROM/PLA" . Archivado del original el 9 de julio de 2011. Recuperado el 10 de julio de 2011 .
- ↑ "6502 imágenes" . Archivado del original el 4 de marzo de 2016. Consultado el 22 de enero de 2015 .
- ↑ Características funcionales del modelo 50 del IBM System/360 (PDF) . IBM . 1967. pág. 7. A22-6898-1 . Consultado el 29 de octubre de 2021 .
- ↑ Bell, Gordon ; Strecker, WD ¿Qué hemos aprendido del PDP-11? – ¿Qué hemos aprendido de VAX y Alpha? (PDF) (Informe). pág. 30. Recuperado el 26 de junio de 2025 .
- ↑ Matemáticas Modernas . Infobase. 2006. ISBN 978-0-7910-9720-5.
- ↑ Everett, RR; Swain, FE (1947). Diagramas de bloques de la computadora Whirlwind I (PDF) (Informe técnico). Laboratorio de servomecanismos del MIT. R-127. Archivado del original (PDF) el 17 de junio de 2012. Recuperado el 21 de junio de 2006 .
- ↑
- 1 2 Shirriff, Ken. "Simulación del mainframe IBM 360/50 a partir de su microcódigo" . Blog de Ken Shirriff .
- ↑ Supnik, Bob (mayo de 1988). Microarquitectura VLSI VAX (PDF) . Equipos digitales.
- ↑ Starnes, Thomas (abril de 1983). "Filosofía de diseño detrás del MC68000 de Motorola" . Byte .
- 1 2 3 Cocke, John; Markstein, Victoria (enero de 1990). "La evolución de la tecnología RISC en IBM" (PDF) . IBM Journal of Research and Development . 34 (1): 4– 11. doi : 10.1147/rd.341.0004 .
- 1 2 Clark, Douglas; Strecker, William (septiembre de 1980). "Comentarios sobre "El caso de la computadora con conjunto de instrucciones reducido", de Patterson y Ditzel" . ACM SIGARCH Computer Architecture News . 8 (6): 34–38 . doi : 10.1145/641914.641918 . S2CID 14939489 .
- ↑ "La canalización de ejecución de la CPU Intel i486". Resumen de ponencias de Compcon Spring '90. Trigésimo quinta Conferencia Internacional de la IEEE Computer Society sobre Apalancamiento Intelectual . San Francisco, CA: IEEE . doi : 10.1109/CMPCON.1990.63682 . ISBN 978-0-8186-2028-7.
- ↑ "Procesador Pentium Pro a 150, 166, 180 y 200 MHz" (PDF) (Hoja de datos). Intel . Noviembre de 1995.
- 1 2 "Parte I / Arquitectura común, Capítulo 6 Arquitectura común de PALcode". Manual de referencia de la arquitectura Alpha AXP (PDF) (Segunda edición). Digital Press . 1995. ISBN 978-1-55558-145-9.
- ↑ Rogers, Bob (septiembre-octubre de 2012). "Qué es y por qué de zEnterprise Millicode" . IBM Systems Magazine . Archivado del original el 9 de octubre de 2012.
- ↑ "Computadora EMIDEC 1100" . Emidec.org.uk. Archivado del original el 12 de junio de 2010. Consultado el 26 de abril de 2010 .
- ↑ Características funcionales del modelo 25 del IBM System/360 (PDF) . IBM. Enero de 1968. pág. 22. A24-3510-0 . Consultado el 29 de octubre de 2021 .
- 1 2 3 Teoría de operación de ingeniería de campo, unidad de procesamiento 2030, modelo System/360 30 (PDF) (Primera ed.). IBM. Junio de 1967. Y24-3360-1. Archivado (PDF) del original el 1 de abril de 2020. Recuperado el 9 de noviembre de 2019 .
- ↑ Edward A. Snow; Daniel P. Siewiorek (1982). "Implementación y evaluación del rendimiento de la familia PDP-11" . En Daniel P. Siewiorek ; C. Gordon Bell ; Allen Newell (eds.). Estructuras informáticas: principios y ejemplos . Nueva York, NY : McGraw-Hill Book Company . pág . 671. ISBN 978-0-07-057302-4.
- ↑ Soltis, Frank (septiembre de 1981). "Diseño de un sistema de procesamiento de datos para pequeñas empresas" . IEEE Computer . 14 : 77–93 . doi : 10.1109/CM.1981.220610 . S2CID 398484 .
- ↑ Frank G. Soltis (1997). Inside the AS/400, Segunda edición . Duke Press. ISBN 978-1-882419-66-1.
- ↑ "Entrevista: Luchando contra la N64 (Naboo)" . IGN64. 10 de noviembre de 2000. Archivado del original el 13 de septiembre de 2007. Consultado el 27 de marzo de 2008 .
- ↑ "Indiana Jones y la máquina infernal" . IGN . 12 de diciembre de 2000. Archivado del original el 27 de septiembre de 2013. Consultado el 24 de septiembre de 2013 .
- ↑ Meynink, Todd (28 de julio de 2000). "Postmortem: Resident Evil 2 de Angel Studios (versión N64)" . Gamasutra . United Business Media LLC . Archivado del original el 21 de octubre de 2012. Recuperado el 18 de octubre de 2010 .
- ↑ Manual de referencia del sistema informático Digital Scientific Meta 4 Series 16 (PDF) . Digital Scientific Corporation. Mayo de 1971. 7032MO. Archivado (PDF) del original el 14 de enero de 2020. Consultado el 14 de enero de 2020 .
- ↑ Manual de referencia de la memoria de solo lectura (ROM) del sistema informático Digital Scientific Meta 4 (PDF) . Digital Scientific Corporation. Marzo de 1970. 7024MO. Archivado (PDF) del original el 23 de septiembre de 2019. Consultado el 14 de enero de 2020 .
- ↑ Manual preliminar del sistema informático Digital Scientific Meta 4 Series 16 (PDF) . Digital Scientific Corporation. Junio de 1970. 7006MO. Archivado (PDF) del original el 23 de septiembre de 2019. Consultado el 14 de enero de 2020 .
- ↑ Sistema informático Digital Scientific Meta 4: Listado de patrones ROM típicos y programa para simular el conjunto de instrucciones IBM 1130 (PDF) . Digital Scientific Corporation. Enero de 1970. M4/005P-170. Archivado (PDF) del original el 24 de marzo de 2020. Consultado el 14 de enero de 2020 .
- ↑ "Western Digital 1600" . AntiqueTech. Archivado del original el 3 de enero de 2017. Consultado el 5 de enero de 2017 .
- ↑ "Microcódigo 8086 desensamblado « Blog de Reenigne" . Consultado el 30 de junio de 2026 .
- ↑ "Microcódigo 80386 desensamblado « Blog de Reenigne" . Consultado el 23 de mayo de 2026 .
- ↑ "Microcódigo AMD" .
- ↑ "Otras CPU x86 - Vía - otras" .
- ↑ Hayes, John P. (1978). Arquitectura y organización de computadoras . McGraw-Hill. pág. 300. ISBN 978-0-07-027363-4.
- ↑ Neal Harman; Andy Gimblett (12 de octubre de 2009). "CS-323: Microprocesadores de alto rendimiento – Capítulo 1. Microprogramación" . mat.uson.mx. Archivado del original el 19 de abril de 2015. Consultado el 8 de agosto de 2015 .
- ↑ Vaupel, Robert (2013). Alta disponibilidad y escalabilidad de entornos mainframe utilizando System z y z/OS como ejemplo . KIT Scientific. pág. 26. ISBN 978-3-7315-0022-3.
- ↑ Rogers, Bob (septiembre-octubre de 2012). "Qué es y por qué de zEnterprise Millicode" . IBM Systems Magazine . Archivado del original el 16 de octubre de 2013. Consultado el 7 de noviembre de 2013 .
- ↑ "Guía de diseño de sistemas PALcode para microprocesadores Alpha" (PDF) . Digital Equipment Corporation . Mayo de 1996. Archivado (PDF) del original el 15 de agosto de 2011. Consultado el 7 de noviembre de 2013 .
- ↑ Spruth, Wilhelm (diciembre de 2012). El diseño de un microprocesador . Springer Science & Business Media. pág. 31. ISBN 978-3-642-74916-2Archivado del original el 20 de noviembre de 2016. Consultado el 18 de enero de 2015 .
- ↑ Koopman, Philip Jr. (1987). "Computadoras orientadas a pila con conjunto de instrucciones modificable: El concepto WISC" (PDF) . The Journal of Forth Application and Research : 49–71 . Archivado (PDF) del original el 11 de mayo de 2008.
- ↑ Smith, Eric (3 de septiembre de 2002). "Re: ¿Cuál era el tamaño del microcódigo en varias máquinas?" . Grupo de noticias : alt.folklore.computers . Usenet: qhn0qyveyu.fsf@ruckus.brouhaha.com . Archivado del original el 26 de enero de 2009. Recuperado el 18 de diciembre de 2008 .
- ↑ Smotherman, Mark. "CPSC 3300 / El alma de una nueva máquina" . Consultado el 27 de octubre de 2023. Almacenamiento
de control escribible SRAM de 4096 x 75 bits: microinstrucción de 74 bits con 1 bit de paridad (18 campos).
- ↑ Principios de funcionamiento del IBM System/370 (PDF) . Cuarta edición. IBM. Septiembre de 1974. págs. 98, 245. GA22-7000-4. Archivado (PDF) del original el 29 de febrero de 2012. Consultado el 27 de agosto de 2012 .
- ↑ Características funcionales del IBM System/360 Modelo 85 (PDF) . SEGUNDA EDICIÓN. IBM. Junio de 1968. A22-6916-1 . Consultado el 29 de octubre de 2021 .
- ↑ Descripción de características especiales del IBM System/360 709/7090/7094 Característica de compatibilidad para el IBM System/360 Modelo 85. Primera edición. IBM. Marzo de 1969. GA27-2733-0.
- ^ Más quieto, Andreas; Paul, Matías R. (12 de mayo de 1996). "Prozessorgeflüster" . c't – revista para tecnología informática . Tendencias y noticias (en alemán). Heise Verlag . Archivado desde el original el 28 de agosto de 2017 . Consultado el 28 de agosto de 2017 .
- ↑ "9.11: Funcionalidades de actualización de microcódigo". Manual del desarrollador de software para arquitecturas Intel 64 e IA-32, Volumen 3A: Guía de programación del sistema, Parte 1 (PDF) . Intel . Septiembre de 2016.
- ↑ Intel actualiza todos los procesadores recientes y promete correcciones de hardware para los próximos chips de octava generación. Por Paul Alcorn, 15 de marzo de 2018.
- ↑ "Descargar archivo de datos de microcódigo del procesador Linux*" . Archivado del original el 19 de marzo de 2018. Consultado el 21 de marzo de 2018 .
- ↑ "Utilidad de actualización de microcódigo de Intel para Linux" . Archivado del original el 26 de febrero de 2012.
- ↑ " [ puertos ] Índice de /head/sysutils/cpupdate" . Freebsd.org. Archivado del original el 1 de abril de 2020. Consultado el 16 de enero de 2020 .
- ↑ "Hay disponible una actualización de confiabilidad del microcódigo que mejora la confiabilidad de los sistemas que usan procesadores Intel" . Archivado del original el 23 de febrero de 2008. Consultado el 25 de febrero de 2008 .
- ↑ "Productos para servidores: se requiere una actualización del BIOS cuando aparece el mensaje de microcódigo faltante durante el POST" . Intel . 24 de enero de 2013. Archivado del original el 1 de septiembre de 2014.
- ↑ "Manual de mantenimiento y reparación del modelo 990/12 LR Computer Depot" (PDF) . Bitsavers.org . Texas Instruments . Consultado el 15 de febrero de 2024 .
- ↑ Guía del programador del sistema de desarrollo de microcódigo MDS-990 para la computadora modelo 990 de Texas Instruments ( edición del 15 de agosto de 1979). Archivos de Texas Instruments, RG-20, número de acceso 94-08, caja 10, 45C. Biblioteca DeGolyer, Universidad Metodista del Sur, Dallas, TX, EE. UU.
{{cite book}}: CS1 mantenimiento: ubicación ( enlace ) - ↑ Guía del usuario de LSI-11 WCS (PDF) (1.ª ed.). Digital Equipment Corporation. Junio de 1978. Archivado (PDF) del original el 23 de febrero de 2023. Consultado el 7 de enero de 2023 .
- ↑ "Servidores IBM pSeries - Actualización de microcódigo para Ultrastar 73LZX (US73) 18/36 GB" . IBM . Archivado del original el 19 de abril de 2019. Consultado el 22 de enero de 2015 .
Lecturas adicionales
- Smith, Richard E. (1988). "Una visión histórica de la arquitectura de computadoras" . Anales de la historia de la computación . 10 (4): 277– 303. Bibcode : 1988IAHC...10d.277S . doi : 10.1109/MAHC.1988.10039 . S2CID 16405547. Recuperado el 21 de junio de 2006 .
- Smotherman, Mark (octubre de 2022). "Una breve historia de la microprogramación" . Recuperado el 27 de octubre de 2023 .
- Wilkes, MV (1986). "La génesis de la microprogramación" . Anales de la historia de la computación . 8 (2): 116– 126. Bibcode : 1986IAHC....8b.116M . doi : 10.1109/MAHC.1986.10035 . S2CID 1978847. Recuperado el 7 de agosto de 2006 .
- Wilkes, MV ; Stringer, JB (abril de 1953). "Microprogramación y diseño de los circuitos de control en una computadora digital electrónica" . Actas matemáticas de la Sociedad Filosófica de Cambridge . 49 (2): 230–238 . Bibcode : 1953PCPS...49..230W . doi : 10.1017/S0305004100028322 . S2CID 62230627. Consultado el 23 de agosto de 2006 .
- Husson, SS (1970). Principios y prácticas de la microprogramación . Prentice-Hall. ISBN 978-0-13-581454-3.
- Tucker, SG (1967). "Control de microprogramas para SYSTEM/360" (PDF) . IBM Systems Journal . 6 (4): 222– 241. doi : 10.1147/sj.64.0222 . Recuperado el 6 de febrero de 2026 .
- Shirriff, Ken (diciembre de 2022). "Cómo funciona el motor de microcódigo del procesador 8086" .
Enlaces externos
- Computadora con conjunto de instrucciones modificables
- Almacenamiento de solo lectura del condensador
- Procesamiento de instrucciones
- Firmware
- unidad central de procesamiento
- BIOS
- Controladores de dispositivos