stringtranslate.com

Microcódigo

En el diseño de procesadores , el microcódigo sirve como una capa intermediaria situada entre el hardware de la unidad central de procesamiento (CPU) y la arquitectura del conjunto de instrucciones visible para el programador de una computadora, también conocida como código de máquina . [1] [ página necesaria ] Consiste en un conjunto de instrucciones a nivel de hardware que implementan instrucciones de código de máquina de nivel superior o controlan la secuenciación interna de la máquina de estados finitos en muchos componentes de procesamiento digital . Si bien el microcódigo se utiliza en CPU de uso general en computadoras de escritorio contemporáneas, también funciona como una ruta alternativa para escenarios que la unidad de control cableada más rápida no puede manejar. [2]

Alojado en una memoria especial de alta velocidad, el microcódigo traduce instrucciones de máquina, datos de máquina de estado 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 modificación de las instrucciones. Además, facilita la construcción de instrucciones complejas de varios pasos y, al mismo tiempo, reduce la complejidad de los circuitos informáticos. El acto de escribir microcódigo a menudo se denomina microprogramación , y el microcódigo en una implementación de procesador específica a veces se denomina microprograma .

A través de una microprogramación extensa, las microarquitecturas de menor escala y simplicidad pueden emular arquitecturas más robustas con longitudes de palabras más amplias , 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 familia de procesadores.

Algunos proveedores de hardware, en particular IBM / Lenovo , utilizan el término microcódigo indistintamente con firmware . En este contexto, todo código dentro de un dispositivo se denomina microcódigo, ya sea microcódigo o código de máquina. Por ejemplo, las actualizaciones del microcódigo de una unidad de disco duro a menudo incluyen actualizaciones tanto de su microcódigo como de su firmware. [3]

Descripción general

Conjuntos de instrucciones

A nivel de hardware, los procesadores contienen varias áreas separadas de circuitos, o "unidades", que realizan diferentes tareas. Las unidades más comunes incluyen la unidad lógica aritmética (ALU), que realiza instrucciones como sumar o comparar dos números, circuitos para leer y escribir datos en la memoria externa y pequeñas áreas de memoria integrada para almacenar estos valores mientras se procesan. En la mayoría de los diseños, se utiliza memoria adicional de alto rendimiento, el archivo de registro , para almacenar valores temporales, no sólo los que necesita la instrucción actual. [4]

Para realizar 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 adecuado de estas instrucciones depende en gran medida del programador, o al menos del compilador del lenguaje de programación que está utilizando. Entonces, para sumar dos números, por ejemplo, el compilador puede generar instrucciones para cargar uno de los valores en un registro, el segundo en otro, llamar a la función de suma en la ALU y luego escribir el resultado nuevamente en la memoria. [4]

Como la secuencia de instrucciones necesarias para completar este concepto de nivel superior, "sumar estos dos números en la memoria", puede requerir múltiples instrucciones, esto puede representar un cuello de botella en el rendimiento si esas instrucciones se almacenan en la memoria principal . Leer esas instrucciones una por una requiere tiempo que podría usarse 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 en gran medida en dónde almacenan los datos. Por ejemplo, el MOS 6502 tiene ocho variaciones de la instrucción de suma, ADCque difieren sólo en dónde buscan encontrar los dos operandos. [5]

El uso de la variación de la instrucción, o " código de operación ", que más se acerque 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 abierto para otras operaciones. Internamente, sin embargo, estas instrucciones no son operaciones separadas, sino secuencias de las operaciones que las unidades realmente realizan. Convertir una sola instrucción leída de la memoria en una secuencia de acciones internas es tarea de la unidad de control , otra unidad dentro del procesador. [6]

Microcódigo

La idea básica detrás del microcódigo es reemplazar la lógica personalizada que implementa la secuencia de instrucciones con una serie de instrucciones simples ejecutadas en un "motor de microcódigo" en el procesador. Mientras que un sistema lógico personalizado puede tener una serie de diodos y compuertas que generan una serie de voltajes en varias líneas de control, el motor de microcódigo está conectado a estas líneas, y estas se encienden y apagan a medida que el motor lee las instrucciones del microcódigo en secuencia. . Las instrucciones del microcódigo a menudo están codificadas en bits en esas líneas; por ejemplo, si el bit 8 es verdadero, eso podría significar que la ALU debe estar en pausa a la espera de datos. En este sentido, el microcódigo es algo similar a los rollos de papel de una pianola , donde los agujeros representan qué tecla se debe presionar.

La distinción entre lógica personalizada y microcódigo puede parecer pequeña: uno utiliza un patrón de diodos y compuertas para decodificar la instrucción y producir una secuencia de señales, mientras que el otro codifica las señales como microinstrucciones que se leen en secuencia para producir los mismos resultados. La diferencia fundamental es que en un diseño lógico personalizado, los cambios en los pasos individuales requieren que se rediseñe la lógica. Al usar microcódigo, todo lo que cambia es el código almacenado en la memoria de solo lectura (ROM) asociada. Esto hace que sea mucho más fácil solucionar problemas en un sistema de microcódigo. También significa que no existe un límite efectivo para la complejidad de las instrucciones, solo está limitada por la cantidad de ROM que uno está dispuesto a usar.

La capa más baja en la pila de software de una computadora son tradicionalmente instrucciones de código de máquina sin procesar para el procesador. En los procesadores microcodificados, la obtención y decodificación de esas instrucciones y su ejecución se pueden realizar mediante microcódigo. Para evitar confusiones, cada elemento relacionado con el microprograma se diferencia por el prefijo micro : microinstrucción, microensamblador, microprogramador, etc. [ cita necesaria ]

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 realizarse esencialmente de forma asincrónica en paralelo. Por ejemplo, el VAX 9000 tiene una unidad IBox para buscar y decodificar instrucciones, que entrega a una unidad EBox microcodificada para su ejecución, [7] y el VAX 8800 tiene una IBox microcodificada y una EBox microcodificada. [8]

Un programador de alto nivel, o incluso un programador en lenguaje ensamblador , normalmente no ve ni cambia el microcódigo. A diferencia del código de máquina, que a menudo conserva cierta compatibilidad con versiones anteriores entre diferentes procesadores de una familia, el microcódigo sólo se ejecuta en el circuito electrónico exacto para el que está 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 de 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 todo el microcódigo almacenado en una memoria estática de acceso aleatorio (SRAM) o memoria flash . Esto se denomina tradicionalmente almacén de control grabable en el contexto de las computadoras, que puede ser de solo lectura o de lectura-escritura . En el último caso, el proceso de inicialización de la CPU carga el microcódigo en el almacén 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 la máquina.

Microprogramas

Los microprogramas constan de una serie de microinstrucciones que controlan la CPU en un nivel muy fundamental de circuitos de hardware. Por ejemplo, una única microinstrucción horizontal típica podría especificar las siguientes operaciones:

Para controlar simultáneamente todas las funciones del procesador en un ciclo, la microinstrucción suele tener más de 50 bits; por ejemplo, 128 bits en un 360/85 con función de emulador. Los microprogramas se diseñan y optimizan cuidadosamente para la ejecución más rápida posible, ya que un microprograma lento daría como resultado 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 simple para desarrollar la lógica de control de una computadora. Inicialmente, los conjuntos de instrucciones de la CPU estaban cableados . Cada paso necesario para buscar, decodificar y ejecutar las instrucciones de la máquina (incluidos los cálculos, lecturas y escrituras de direcciones de operandos) se controlaba directamente mediante lógica combinacional y un circuito de máquina de estado secuencial bastante mínimo. Si bien estos procesadores cableados eran muy eficientes, la necesidad de potentes conjuntos de instrucciones con direccionamiento de varios pasos y operaciones complejas ( ver más abajo ) dificultaba su diseño y depuración; Las instrucciones altamente codificadas y de longitud variada también pueden contribuir a esto, especialmente cuando se utilizan codificaciones muy irregulares.

El microcódigo simplificó el trabajo al permitir que gran parte del comportamiento del procesador y del modelo de programación se definieran mediante rutinas de microprogramas en lugar de mediante circuitos dedicados. Incluso al final del proceso de diseño, el microcódigo se podía cambiar fácilmente, mientras que los diseños de CPU cableados eran muy engorrosos de cambiar. Por tanto, esto facilitó enormemente el diseño de la CPU.

Desde la década de 1940 hasta finales de la de 1970, una gran parte de la programación se realizó en lenguaje ensamblador ; Las instrucciones de nivel superior significan 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 última extensión de esto son los diseños de "lenguaje de alto nivel ejecutable directamente", en los que cada declaració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, las velocidades de la CPU crecieron más rápidamente que las velocidades de la memoria y se utilizaron numerosas técnicas como la transferencia de bloques de memoria , la recuperación previa de la memoria y los cachés multinivel para aliviar esto. Las instrucciones de máquina de alto nivel, posibles gracias al microcódigo, ayudaron aún más, ya que menos instrucciones de máquina más complejas requieren menos ancho de banda de memoria. Por ejemplo, una operación en una cadena de caracteres se puede realizar como una única instrucción de máquina, evitando así múltiples recuperaciones de instrucciones.

Las arquitecturas con conjuntos de instrucciones implementados por microprogramas complejos incluían IBM System/360 y Digital Equipment Corporation VAX . El enfoque de conjuntos de instrucciones cada vez más complejos implementados con microcódigo se denominó más tarde computadora con conjunto de instrucciones complejas (CISC). Un enfoque alternativo, utilizado en muchos microprocesadores , es utilizar una o más matrices lógicas programables (PLA) o memoria de sólo lectura (ROM) (en lugar de lógica combinacional) principalmente para la decodificación de instrucciones, y dejar que una máquina de estados simple (sin mucho, o cualquier microcódigo) hacen la mayor parte de la secuenciación. MOS Technology 6502 es un ejemplo de microprocesador que utiliza un PLA para decodificar y secuenciar instrucciones. El PLA es visible en microfotografías del chip [11] y su funcionamiento puede verse en la simulación a nivel de transistor .

La microprogramación todavía se utiliza en los diseños de CPU modernos. En algunos casos, después de depurar el microcódigo en la simulación, el almacén de control se sustituye por funciones lógicas. [ cita necesaria ] Las funciones lógicas suelen ser más rápidas y menos costosas que la memoria de microprograma equivalente.

Beneficios

Los microprogramas de un procesador operan en una arquitectura más primitiva, totalmente diferente y mucho más orientada al hardware que las instrucciones de ensamblaje visibles para los programadores normales. En coordinación con el hardware, el microcódigo implementa la arquitectura visible para el programador. No es necesario que el hardware subyacente tenga 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.

IBM System/360 tiene una arquitectura de 32 bits con 16 registros de propósito general, pero la mayoría de las implementaciones de System/360 utilizan hardware que implementa una microarquitectura subyacente mucho más simple; por ejemplo, el System/360 Model 30 tiene rutas de datos de 8 bits a la unidad lógica aritmética (ALU) y la memoria principal e implementó los registros de propósito general en una unidad especial de memoria central de mayor velocidad , y el System/360 Model 40 tiene rutas de datos de 8 bits a la ALU y rutas de datos de 16 bits a la memoria principal y también implementó los registros de propósito general en una unidad especial de memoria central de mayor velocidad. El Modelo 50 tiene rutas de datos completas de 32 bits e implementa registros de propósito general en una unidad especial de memoria central de mayor velocidad. [12] Del Modelo 65 al Modelo 195 tienen rutas de datos más grandes e implementan registros de propósito general en circuitos de transistores más rápidos. [ cita necesaria ] De esta manera, la microprogramación permitió a IBM diseñar muchos modelos System/360 con hardware sustancialmente diferente y que abarcan una amplia gama de costos y rendimiento, al tiempo que los hacía todos arquitectónicamente compatibles. Esto reduce drásticamente la cantidad de programas de software de sistema únicos que deben escribirse para cada modelo.

Digital Equipment Corporation (DEC) utilizó un enfoque similar en su familia de computadoras VAX. Como resultado, diferentes procesadores VAX utilizan diferentes microarquitecturas, pero la arquitectura visible para el programador no cambia.

La microprogramación también reduce el costo de los cambios de campo para corregir defectos ( bugs ) 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

En 1947, el diseño del MIT Whirlwind introdujo el concepto de almacén de control como una forma de simplificar el diseño de computadoras e ir más allá de los métodos ad hoc . El almacén de control es una matriz de diodos : una red bidimensional, donde una dimensión acepta "pulsos de tiempo de control" del reloj interno de la CPU y la otra se conecta a señales de control en puertas y otros circuitos. Un "distribuidor de impulsos" toma los impulsos generados por el reloj de la CPU y los divide en ocho impulsos 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. [13]

En 1951, Maurice Wilkes [14] mejoró este concepto agregando ejecución condicional , un concepto similar al condicional en el software de computadora. Su implementación inicial consistió en un par de matrices: la primera generaba señales a la manera del almacén de control Whirlwind, mientras que la segunda matriz seleccionaba qué fila de señales (la palabra de instrucción del microprograma, por así decirlo) invocar en el siguiente ciclo. Los condicionales se implementaron proporcionando una forma en que una sola línea en el almacén de control pudiera elegir entre alternativas en la segunda matriz. Esto hizo que las señales de control estuvieran condicionadas a 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 siguió 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 al de usar un almacén de control personalizado. Esto cambió a principios de la década de 1960 con la introducción de la memoria central y la cuerda central 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 fue IBM en su serie System/360 de 1964 . Esto permitió que las máquinas tuvieran un conjunto de instrucciones muy complejo, incluidas operaciones que coincidían con construcciones de lenguaje de alto nivel, como formatear valores binarios como cadenas decimales, y almacenar la compleja serie de instrucciones necesarias para esta tarea en una memoria de bajo costo. [15]

Pero el valor real de la línea 360 era que se podía construir una serie de máquinas que eran completamente diferentes internamente, pero que ejecutaban el mismo ISA. Para una máquina de gama baja, se podría usar una ALU de 8 bits que requiera múltiples ciclos para completar una única suma de 32 bits, mientras que una máquina de gama alta podría tener una ALU completa de 32 bits que realice 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. Usar microcódigo significaba que todo lo que cambiaba era el código en la ROM. Por ejemplo, una máquina podría incluir una unidad de coma flotante y, por lo tanto, 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 haría lo mismo usando sumas múltiples, y todos lo que cambió fue la ROM. [15]

El resultado de este diseño fue que los clientes podían utilizar un modelo de gama baja de la familia para desarrollar su software, sabiendo que si alguna vez necesitaban más rendimiento, podían pasar a una versión más rápida y nada más cambiaría. Esto redujo la barrera de entrada y el 360 fue un gran éxito. A finales de la década, el uso de microcódigo era de rigor en toda la industria de mainframe.

Subiendo la línea

El microcódigo (y "nanocódigo") del Motorola 68000 se almacena en los dos grandes bloques cuadrados en la parte superior derecha y se controla mediante un circuito a la derecha. Ocupa una cantidad significativa de la superficie total de la viruta.

Las primeras minicomputadoras eran demasiado simples para requerir microcódigo y eran más similares a las computadoras centrales anteriores en términos de sus conjuntos de instrucciones y la forma en que se decodificaban. Pero no pasó mucho tiempo antes de que sus diseñadores comenzaran a utilizar circuitos integrados más potentes que permitieran ISA 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 del PDP-11 y, más notablemente, la mayoría de los modelos del VAX , que incluían instrucción de alto nivel similar a las que se encuentran en el 360. . [dieciséis]

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 que eran lo suficientemente simples como para implementarse en una lógica dedicada. En ese momento, la lógica de control podría integrarse en el mismo chip que la CPU, lo que haría que la diferencia de costo entre la ROM y la lógica fuera un problema menor. Sin embargo, no pasó mucho tiempo antes de que estas empresas también se enfrentaran al problema de introducir diseños de mayor rendimiento pero aún queriendo ofrecer compatibilidad con versiones anteriores . Entre los primeros ejemplos de microcódigo en micros se encontraba el Intel 8086 . [6]

Entre las implementaciones definitivas de microcódigo en microprocesadores se encuentra el Motorola 68000 . Esto ofrecía un conjunto de instrucciones altamente ortogonal con una amplia variedad de modos de direccionamiento , todos implementados en microcódigo. Esto no fue sin costo, según los primeros artículos, alrededor del 20% de la superficie del chip (y por lo tanto del costo) es el sistema de microcódigo. [17] y estimaciones posteriores sugieren que aproximadamente 23.000 de los 68.000 sistemas de puertas eran parte del sistema de microcódigo.

RISC entra

Mientras las empresas seguían compitiendo por la complejidad de sus conjuntos de instrucciones y el uso de microcódigo para implementarlos era incuestionable, a mediados de la década de 1970 un proyecto interno en IBM planteaba serias dudas sobre todo el concepto. Como parte de un proyecto para desarrollar un conmutador telefónico totalmente digital de alto rendimiento , un equipo dirigido por John Cocke comenzó a examinar enormes volúmenes de datos de rendimiento de los programas 360 (y System/370 ) de sus clientes . Esto los llevó a notar un patrón curioso: cuando ISA presentaba múltiples versiones de una instrucción, el compilador casi siempre usaba la más simple, en lugar de la que representaba más directamente el código. Aprendieron que esto se debía a que esas instrucciones siempre se implementaban en el hardware y, por lo tanto, se ejecutaban más rápido. Usar la otra instrucción podría ofrecer un mayor rendimiento en algunas máquinas, pero no había manera de saber en qué máquina se estaban ejecutando, esa fue la razón principal para usar microcódigo en primer lugar, para ocultar estas distinciones. [18]

El equipo llegó a una conclusión radical: "Imponer microcódigo entre una computadora y sus usuarios impone una costosa sobrecarga al realizar las instrucciones ejecutadas con mayor frecuencia". [18]

El resultado de este descubrimiento fue lo que hoy se conoce como concepto RISC . El complejo motor de microcódigo y su ROM asociada se reduce o elimina por completo, y esos circuitos se dedican a cosas 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 en manos del compilador, que es el propósito principal de utilizar un compilador en primer lugar. El concepto básico pronto fue adoptado por investigadores universitarios de California, donde las simulaciones sugirieron que tales diseños superarían trivialmente incluso a los diseños convencionales más rápidos. Fue uno de esos 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, incluido un famoso artículo desdeñoso del equipo VAX de Digital. [19] Un punto importante de controversia fue que implementar las instrucciones fuera del procesador significaba que se pasaría mucho más tiempo leyendo esas instrucciones desde la memoria, lo que ralentizaba el rendimiento general sin importar qué tan rápido funcionara la CPU. [19] Los defensores señalaron que las simulaciones mostraban claramente que el número de instrucciones no era mucho mayor, especialmente cuando se consideraba el código compilado. [18]

El debate se prolongó hasta que surgieron los primeros diseños comerciales de RISC en la segunda mitad de la década de 1980, que superaron fácilmente a los diseños más complejos de otras empresas. A finales de los años 1980 todo había terminado; 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 sólo para ejecutar instrucciones; Las instrucciones aritméticas y de movimiento registro-registro requerían solo una microinstrucción, lo que permitía completarlas en un ciclo de reloj. [20] El hardware de búsqueda y decodificación del Pentium Pro obtiene instrucciones y las decodifica en una serie 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 un microcódigo que consta de secuencias predefinidas de microoperaciones. [21]

Algunos diseños de procesadores utilizan código de máquina que se ejecuta en un modo especial, con instrucciones especiales, disponibles sólo 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 funciones como el manejo de errores y de interrupciones en el búfer de traducción (TLB), [22] además de proporcionar, para los sistemas basados ​​en Alpha que ejecutan OpenVMS , instrucciones que requieren acceso a memoria entrelazada que son similares a las instrucciones proporcionadas por la arquitectura VAX . [22] Las CPU CMOS IBM System/390 , comenzando con el procesador G4, y las CPU z/Architecture utilizan milicode para implementar algunas instrucciones. [23]

Ejemplos

  • El "microprocesador" B700 ejecuta códigos de operación a nivel de aplicación utilizando secuencias de microinstrucciones de 16 bits almacenadas en la memoria principal; cada una de ellas es una operación de carga de registros o está asignada a una única instrucción de "nanocódigo" de 56 bits almacenada en una memoria de sólo lectura. Esto permite que un hardware comparativamente simple actúe como un controlador periférico de mainframe o se empaquete como una computadora independiente.
  • El B1700 está implementado con un hardware radicalmente diferente, incluida una memoria principal direccionable por bits, pero tiene una organización multicapa similar. El sistema operativo precarga el intérprete para cualquier idioma necesario. Estos intérpretes presentan diferentes máquinas virtuales para COBOL , Fortran , etc.

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:

También puede haber un registro de dirección 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 de usuario. Estos elementos a menudo podrían reunirse en un solo chip. Este chip viene en un ancho fijo que formaría un "rebanado" a través de la unidad de ejecución. Estos se conocen como chips " bit slice ". La familia AMD Am2900 es uno de los ejemplos más conocidos de elementos de corte de bits. [38] Las partes de las unidades de ejecución y todas las unidades de ejecución están interconectadas por un haz de cables llamado bus .

Los programadores desarrollan microprogramas utilizando herramientas de software básicas. Un microensamblador permite a un programador definir la tabla de bits simbólicamente. Debido a su estrecha relación con la arquitectura subyacente, "el microcódigo tiene varias propiedades que dificultan su generación mediante un compilador". [1] Un programa simulador está destinado a ejecutar los bits de la misma manera que la electrónica y permite mucha más libertad para depurar el microprograma. Una vez finalizado y probado exhaustivamente el microprograma, a veces se utiliza como entrada para un programa de computadora que construye lógica para producir los mismos datos. [ cita requerida ] Este programa es similar a los utilizados para optimizar una matriz lógica programable . Incluso sin una lógica completamente óptima, la lógica optimizada heurísticamente puede reducir enormemente la cantidad de transistores necesarios para un almacén de control de memoria de solo lectura (ROM). Esto reduce el costo de producción y la electricidad utilizada por una CPU.

El microcódigo se puede caracterizar como horizontal o vertical , refiriéndose principalmente a si cada microinstrucción controla elementos de la CPU con poca o ninguna decodificación (microcódigo horizontal) [a] o requiere una decodificación extensa mediante lógica combinatoria 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 tiene varias microoperaciones discretas que se combinan en una sola microinstrucción para una operación simultánea". [1] El microcódigo horizontal normalmente está contenido en un almacén de control bastante amplio; No es raro que cada palabra tenga 108 bits o más. En cada tic de un reloj 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 definidos. Por ejemplo, una disposición sencilla 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 puede requerir dos tics de reloj. El ingeniero que lo diseñaría escribiría el código fuente del microensamblador con este aspecto:

 # Cualquier línea que comience con un signo numérico es un comentario # Esto es solo una etiqueta, la forma habitual en que los ensambladores representan simbólicamente una # dirección de memoria. InstrucciónJUMP : # Para prepararse para la siguiente instrucción, el microcódigo de decodificación de instrucciones ya ha # movido el contador del programa al registro de dirección de memoria. Esta instrucción # recupera la dirección objetivo de la instrucción de salto de la palabra de memoria que sigue al # código de operación de salto, copiándola del registro de datos de la memoria al registro de dirección de la memoria. # Esto le da al sistema de memoria dos tics de reloj para buscar la siguiente # instrucción en el registro de datos de la memoria para su uso en la decodificación de instrucciones. # La instrucción del secuenciador "siguiente" significa simplemente agregar 1 a la dirección de la palabra de control. MDR , NINGUNO , MAR , COPIA , SIGUIENTE , NINGUNO # Esto coloca la dirección de la siguiente instrucción en la PC. # Esto le da al sistema de memoria un tic de reloj para finalizar la búsqueda iniciada en la # microinstrucción anterior. # La instrucción del secuenciador debe saltar al inicio de la decodificación de la instrucción. MAR , 1 , PC , ADD , JMP , InstrucciónDecode # La decodificación de instrucciones no se muestra, porque suele ser un desastre, muy particular # para el 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 solo una # instrucción de salto, esas CPU tienen una familia de instrucciones de salto relacionadas.                   

Para cada tick, es común encontrar que solo se utilizan algunas partes de la CPU, y que los grupos restantes de bits en la microinstrucción no son operativos. Con un diseño cuidadoso del hardware y del microcódigo, esta propiedad puede explotarse para paralelizar operaciones que utilizan diferentes áreas de la CPU; por ejemplo, en el caso anterior, la ALU no es necesaria durante el primer tic, por lo que podría usarse para completar una instrucción aritmética anterior.

Microcódigo vertical

En el microcódigo vertical, cada microinstrucción está significativamente codificada, es decir, los campos de bits generalmente pasan por una lógica combinatoria 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 generan directamente las señales de control y secuenciación o sólo están mínimamente codificados. En consecuencia, el microcódigo vertical requiere longitudes de instrucción más pequeñas y menos almacenamiento, pero requiere más tiempo para decodificar, lo que resulta en un reloj de CPU más lento. [39]

Algún microcódigo vertical es 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 en los mainframes IBM posteriores System/390 yz /Architecture , utilizan código de máquina y se ejecutan en un modo especial que les da acceso a instrucciones especiales, registros especiales y otros recursos de hardware que no están disponibles para código de máquina normal, para implementar algunas instrucciones y otras funciones, [40] [41] como recorridos por tablas de páginas en procesadores Alpha. [42] Esto se llama código PAL en los procesadores Alpha y milicode en los procesadores de mainframe IBM.

Otra forma de microcódigo vertical tiene dos campos:

La selección de campo selecciona 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, un diseñador elige explícitamente crear una CPU más lenta para ahorrar dinero al reducir los bits no utilizados en el almacén de control; sin embargo, la complejidad reducida puede aumentar la frecuencia del reloj de la CPU, lo que reduce 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 CPU que utilizan microcódigo, mientras que el microcódigo vertical se utiliza con menos frecuencia.

Cuando se utilizan microcódigos tanto verticales como horizontales, el microcódigo horizontal puede denominarse nanocódigo o picocódigo . [43]

Almacén de control grabable

Algunas computadoras se construyeron usando microcódigo grabable . En este diseño, en lugar de almacenar el microcódigo en una ROM o en una lógica cableada, el microcódigo se almacena en una RAM llamada almacén de control grabable o WCS . A este tipo de computadora a veces se le llama computadora con conjunto de instrucciones escribibles (WISC). [44]

Muchos prototipos de computadoras experimentales utilizan almacenes de control grabables; También hay máquinas comerciales que utilizan microcódigo grabable, como Burroughs Small Systems , las primeras estaciones de trabajo Xerox , la familia DEC VAX 8800 ( Nautilus ), las máquinas Symbolics L y G, varios IBM System/360 y System/370. implementaciones, algunas máquinas DEC PDP-10 , [45] y el Data General Eclipse MV/8000 . [46]

El IBM System/370 incluye una función llamada Carga inicial de microprograma ( IML o IMPL ) [47] que puede invocarse desde la consola, como parte del reinicio de encendido ( POR ) o desde otro procesador en un complejo multiprocesador estrechamente acoplado .

Algunas máquinas comerciales, por ejemplo IBM 360/85, [48] [49] tienen un almacenamiento de sólo lectura y un almacén de control de escritura para microcódigo.

WCS ofrece varias ventajas, incluida la facilidad de parchear el microprograma y, para ciertas generaciones de hardware, un acceso más rápido que el que pueden proporcionar las ROM. WCS programable por el usuario le permite optimizar la máquina para propósitos específicos.

A partir del Pentium Pro en 1995, varias CPU x86 tienen microcódigo Intel grabable . [50] [51] Esto, por ejemplo, ha permitido corregir errores en los microcódigos Intel Core 2 e Intel Xeon parcheando sus microprogramas, en lugar de requerir que se reemplacen todos los chips. 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 al principio. de 2018. [52] [53] Linux, [54] FreeBSD , [55] Microsoft Windows, [56] o el BIOS de la placa base pueden instalar una actualización de microcódigo. [57]

Algunas máquinas ofrecen almacenes de control grabables programables por el usuario como opción, incluidas las minicomputadoras de la serie HP 2100 , DEC PDP-11/60 , TI-990 /12 [58] [59] y Varian Data Machines V-70 .

Comparación con VLIW y RISC

La tendencia de diseño hacia procesadores fuertemente microcodificados con instrucciones complejas comenzó a principios de los años 1960 y continuó aproximadamente hasta mediados de los años 1980. En ese momento, la filosofía de diseño RISC comenzó a hacerse más prominente.

Una CPU que utiliza microcódigo generalmente necesita varios ciclos de reloj para ejecutar una sola instrucción, un ciclo de reloj por cada paso del microprograma para esa instrucción. Algunos procesadores CISC incluyen instrucciones que pueden tardar mucho en ejecutarse. Tales variaciones interfieren tanto con la latencia de interrupción como, lo que es mucho más importante en los sistemas modernos, con la canalización .

Al diseñar un nuevo procesador, un RISC de control cableado tiene las siguientes ventajas sobre el CISC microcodificado:

También hay contrapuntos:

Muchos procesadores RISC y VLIW están diseñados para ejecutar cada instrucción (siempre que esté en la memoria caché) en un solo ciclo. Esto es muy similar a la forma en que las CPU con microcódigo ejecutan una microinstrucción por ciclo. Los procesadores VLIW tienen instrucciones que se comportan de manera similar a un microcódigo horizontal muy amplio, aunque normalmente sin un control tan detallado sobre el hardware como el que proporciona el microcódigo. Las instrucciones RISC son a veces similares al microcódigo vertical estrecho.

El microcódigo ha sido popular en procesadores de aplicaciones específicas, como procesadores de red , procesadores de señales digitales , controladores de canales , controladores de disco , controladores de interfaz de red , controladores de memoria flash , unidades de procesamiento de gráficos y otro hardware.

Microoperaciones

Las implementaciones CISC modernas, como la familia x86 , decodifican instrucciones en microoperaciones almacenadas dinámicamente con una codificación de instrucciones similar a RISC o microcódigo tradicional. Una unidad de decodificación de instrucciones cableada emite directamente microoperaciones para instrucciones x86 comunes, pero recurre a una ROM de microcódigo más tradicional que contiene microoperaciones para instrucciones más complejas o de uso poco frecuente. [2]

Por ejemplo, un x86 podría buscar microoperaciones a partir de un microcódigo para manejar operaciones complejas de varios pasos, como instrucciones de bucle o cadena, funciones trascendentales de unidades de punto flotante o valores inusuales, como números anormales , e instrucciones de propósito especial como CPUID .

Ver también

Notas

  1. ^ Los procesadores IBM microcodificados horizontalmente tenían múltiples microórdenes y registraban campos seleccionados que requerían decodificación.

Referencias

  1. ^ a b C Kent, Allen; Williams, James G. (5 de abril de 1993). Enciclopedia de informática y tecnología: volumen 28 - Suplemento 13. Nueva York: Marcel Dekker, Inc. ISBN 0-8247-2281-7. Archivado desde el original el 20 de noviembre de 2016 . Consultado el 17 de enero de 2016 .
  2. ^ ab Niebla, Agner (2 de mayo de 2017). La microarquitectura de las CPU Intel, AMD y VIA (PDF) (Reporte). Universidad Técnica de Dinamarca. Archivado (PDF) desde el original el 28 de marzo de 2017 . Consultado el 8 de abril de 2018 .
  3. ^ "Servidores IBM pSeries: actualización de microcódigo para Ultrastar 73LZX (US73) 18/36 GB". IBM . Archivado desde el original el 19 de abril de 2019 . Consultado el 22 de enero de 2015 .
  4. ^ ab Ambos, David (23 de julio de 2020). "La unidad central de procesamiento (CPU): sus componentes y funcionalidad". Sombrero rojo .
  5. ^ Pickens, John. "Códigos de operación NMOS 6502". 6502.org .
  6. ^ ab Comisario, Ken. "Cómo funciona el motor de microcódigo del procesador 8086". Blog de Ken Shirriff .
  7. ^ Descripción técnica del sistema VAX 9000 (PDF) . Corporación de equipos digitales . Mayo de 1990. págs. 3-5–3-32. EK-KA90S-TD-001.
  8. ^ Descripción técnica del sistema VAX 8800 Volumen 2 (PDF) . Corporación de equipos digitales . Julio de 1986. EK-KA882-TD-PRE.
  9. ^ Manning, BM; Mitby, JS; Nicholson, JO (noviembre de 1979). "Procesador microprogramado con almacén de control PLA". Boletín de divulgación técnica de IBM . 22 (6). Archivado desde el original el 1 de octubre de 2012 . Consultado el 10 de julio de 2011 .
  10. ^ A menudo se denomina almacén de control ROM/PLA en el contexto de uso en una CPU; Supnik, Bob (24 de febrero de 2008). "J-11: cuarto y último diseño de microprocesador PDP-11 de DEC... características... almacén de control ROM/PLA". Archivado desde el original el 9 de julio de 2011 . Consultado el 10 de julio de 2011 .
  11. ^ "6502 imágenes". Archivado desde el original el 4 de marzo de 2016 . Consultado el 22 de enero de 2015 .
  12. ^ Características funcionales de IBM System/360 modelo 50 (PDF) . IBM . 1967. pág. 7. A22-6898-1 . Consultado el 29 de octubre de 2021 .
  13. ^ Everett, RR; Swain, FE (1947). Diagramas de bloques de computadora Whirlwind I (PDF) (Reporte técnico). Laboratorio de Servomecanismos del MIT. R-127. Archivado desde el original (PDF) el 17 de junio de 2012 . Consultado el 21 de junio de 2006 .
  14. ^
    • Wilkes, Mauricio (1951). La mejor forma de diseñar una máquina calculadora automática (Informe técnico). Universidad de Manchester .
    • Wilkes, Mauricio (1989). "La mejor forma de diseñar una máquina calculadora automática" (PDF) . En Campbell-Kelly, M. (ed.). Las primeras conferencias informáticas británicas . Prensa del MIT. págs. 182–4. ISBN 978-0-262-23136-7.
  15. ^ ab Comisario, Ken. "Simulación del mainframe IBM 360/50 a partir de su microcódigo". Blog de Ken Shirriff .
  16. ^ Supnik, Bob (mayo de 1988). Microarquitectura VLSI VAX (PDF) . Equipos digitales.
  17. ^ Starnes, Thomas (abril de 1983). "Filosofía de diseño detrás del MC68000 de Motorola". Byte .
  18. ^ abc Cocke, John; Markstein, Victoria (enero de 1990). «La evolución de la tecnología RISC en IBM» (PDF) . Revista IBM de investigación y desarrollo . 34 (1): 4-11. doi :10.1147/rd.341.0004.
  19. ^ ab Clark, Douglas; Strecker, William (septiembre de 1980). "Comentarios sobre" El caso de la computadora de instrucción reducida"". ACM .
  20. ^ "El proceso de ejecución de la CPU Intel i486". Resumen de artículos Compcon Spring '90. Trigésima quinta conferencia internacional de la IEEE Computer Society sobre apalancamiento intelectual . San Francisco, California: IEEE . doi :10.1109/CMPCON.1990.63682. ISBN 0-8186-2028-5.
  21. ^ "Procesador Pentium Pro a 150, 166, 180 y 200 MHz" (PDF) (Hoja de datos). Intel . Noviembre de 1995.
  22. ^ ab "Parte I / Arquitectura común, Capítulo 6 Arquitectura común de código PAL". Manual de referencia de arquitectura Alpha AXP (PDF) (Segunda ed.). Prensa Digital . 1995.ISBN _ 1-55558-145-5.
  23. ^ Rogers, Bob (septiembre-octubre de 2012). "El qué y el por qué de zEnterprise Millicode". Revista de sistemas IBM . Archivado desde el original el 9 de octubre de 2012.
  24. ^ "Computadora EMIDEC 1100". Emidec.org.uk. Archivado desde el original el 12 de junio de 2010 . Consultado el 26 de abril de 2010 .
  25. ^ Características funcionales de IBM System/360 modelo 25 (PDF) . IBM. Enero de 1968. p. 22. A24-3510-0 . Consultado el 29 de octubre de 2021 .
  26. ^ Teoría de operación de ingeniería de campo abc, unidad de procesamiento 2030, sistema / 360 modelo 30 (PDF) (Primera ed.). IBM. Junio ​​de 1967. Y24-3360-1. Archivado (PDF) desde el original el 1 de abril de 2020 . Consultado el 9 de noviembre de 2019 .
  27. ^ Edward A. Nieve; Daniel P. Siewiorek (1982). "Implementación y Evaluación de Desempeño de la Familia PDP-11". En Daniel P. Siewiorek ; C. Gordon Bell ; Allen Newell (eds.). Estructuras informáticas: principios y ejemplos . Nueva York, Nueva York : McGraw-Hill Book Company . pag. 671.ISBN _ 0-07-057302-6.
  28. ^ Soltis, Frank (septiembre de 1981). "Diseño de un sistema de procesamiento de datos para pequeñas empresas". Computadora IEEE . 14 : 77–93. doi :10.1109/CM.1981.220610. S2CID  398484.
  29. ^ Frank G. Soltis (1997). Dentro del AS/400, segunda edición. Prensa de Duque. ISBN 978-1882419661.
  30. ^ "Entrevista: Luchando contra la N64 (Naboo)". IGN64. 10 de noviembre de 2000. Archivado desde el original el 13 de septiembre de 2007 . Consultado el 27 de marzo de 2008 .
  31. ^ "Indiana Jones y la máquina infernal". IGN . 12 de diciembre de 2000. Archivado desde el original el 27 de septiembre de 2013 . Consultado el 24 de septiembre de 2013 .
  32. ^ Meynink, Todd (28 de julio de 2000). "Postmortem: Resident Evil 2 de Angel Studios (versión N64)". Gamasutra . Unidos Business Media LLC . Archivado desde el original el 21 de octubre de 2012 . Consultado el 18 de octubre de 2010 .
  33. ^ Manual de referencia del sistema informático Digital Scientific Meta 4 Series 16 (PDF) . Corporación Científica Digital. Mayo de 1971. 7032MO. Archivado (PDF) desde el original el 14 de enero de 2020 . Consultado el 14 de enero de 2020 .
  34. ^ Manual de referencia de la memoria de solo lectura (ROM) del sistema informático Digital Scientific Meta 4 (PDF) . Corporación Científica Digital. Marzo de 1970. 7024MO. Archivado (PDF) desde el original el 23 de septiembre de 2019 . Consultado el 14 de enero de 2020 .
  35. ^ Manual preliminar del sistema informático Digital Scientific Meta 4 Series 16 (PDF) . Corporación Científica Digital. Junio ​​de 1970. 7006MO. Archivado (PDF) desde el original el 23 de septiembre de 2019 . Consultado el 14 de enero de 2020 .
  36. ^ Listado de patrones ROM típicos del sistema informático Digital Scientific Meta 4 y programa para simular el conjunto de instrucciones IBM 1130 (PDF) . Corporación Científica Digital. Enero de 1970. M4/005P-170. Archivado (PDF) desde el original el 24 de marzo de 2020 . Consultado el 14 de enero de 2020 .
  37. ^ "Occidental Digital 1600". Tecnología antigua. Archivado desde el original el 3 de enero de 2017 . Consultado el 5 de enero de 2017 .
  38. ^ Hayes, John P. (1978). Arquitectura y Organización de Computadores . pag. 300.ISBN _ 0-07-027363-4.
  39. ^ Neal Harman; Andy Gimblett (12 de octubre de 2009). "CS-323: Microprocesadores de alto rendimiento - Capítulo 1. Microprogramación". mat.uson.mx. _ Archivado desde el original el 19 de abril de 2015 . Consultado el 8 de agosto de 2015 .
  40. ^ Vaupel, Robert (2013). Alta disponibilidad y escalabilidad de entornos mainframe utilizando System z y z/OS como ejemplo. KIT Científico. pag. 26.ISBN _ 978-3-7315-0022-3.
  41. ^ Rogers, Bob (septiembre-octubre de 2012). "El qué y el por qué de zEnterprise Millicode". Revista de sistemas IBM . Archivado desde el original el 16 de octubre de 2013 . Consultado el 7 de noviembre de 2013 .
  42. ^ "Guía de diseño del sistema PALcode para microprocesadores Alpha" (PDF) . Corporación de equipos digitales . Mayo de 1996. Archivado (PDF) desde el original el 15 de agosto de 2011 . Consultado el 7 de noviembre de 2013 .
  43. ^ Spruth, Wilhelm (diciembre de 2012). El diseño de un microprocesador. Medios de ciencia y negocios de Springer. pag. 31.ISBN _ 978-3-642-74916-2. Archivado desde el original el 20 de noviembre de 2016 . Consultado el 18 de enero de 2015 .
  44. ^ Koopman, Philip Jr. (1987). "Conjunto de instrucciones grabables, computadoras orientadas a pila: el concepto WISC" (PDF) . La revista de la cuarta aplicación e investigación : 49–71. Archivado (PDF) desde el original el 11 de mayo de 2008.
  45. ^ 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:  [email protected]. Archivado desde el original el 26 de enero de 2009 . Consultado el 18 de diciembre de 2008 .
  46. ^ Smotherman, Mark. "CPSC 3300 / El alma de una nueva máquina" . Consultado el 27 de octubre de 2023 . Almacenamiento de control grabable SRAM de 4096 x 75 bits: microinstrucción de 74 bits con 1 bit de paridad (18 campos)
  47. ^ Principios de funcionamiento de IBM System/370 (PDF) . Cuarta edición. IBM. Septiembre de 1974. págs. 98, 245. GA22-7000-4. Archivado (PDF) desde el original el 29 de febrero de 2012 . Consultado el 27 de agosto de 2012 .
  48. ^ Características funcionales de IBM System/360 modelo 85 (PDF) . SEGUNDA EDICION. IBM. Junio ​​de 1968. A22-6916-1 . Consultado el 29 de octubre de 2021 .
  49. ^ Descripción de la característica especial de IBM System/360 Característica de compatibilidad 709/7090/7094 para IBM System/360 modelo 85 . Primera edición. IBM. Marzo de 1969. GA27-2733-0.
  50. ^ 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 .
  51. ^ "9.11: funciones de actualización de microcódigo". Manual del desarrollador de software de arquitecturas Intel 64 e IA-32, volumen 3A: Guía de programación del sistema, parte 1 (PDF) . Intel . Septiembre de 2016.
  52. ^ Intel parchea todas las CPU recientes y promete correcciones de hardware para los próximos chips de octava generación por Paul Alcorn el 15 de marzo de 2018
  53. ^ "Descargar el archivo de datos de microcódigo del procesador Linux*". Archivado desde el original el 19 de marzo de 2018 . Consultado el 21 de marzo de 2018 .
  54. ^ "Utilidad de actualización de microcódigo Intel para Linux". Archivado desde el original el 26 de febrero de 2012.
  55. ^ "[puertos] Índice de /head/sysutils/cpupdate". Freebsd.org. Archivado desde el original el 1 de abril de 2020 . Consultado el 16 de enero de 2020 .
  56. ^ "Hay disponible una actualización de confiabilidad de microcódigo que mejora la confiabilidad de los sistemas que utilizan procesadores Intel". Archivado desde el original el 23 de febrero de 2008 . Consultado el 25 de febrero de 2008 .
  57. ^ "Productos de servidor: se requiere actualización del BIOS cuando se ve el mensaje Falta microcódigo durante la POST". Intel . 24 de enero de 2013. Archivado desde el original el 1 de septiembre de 2014.
  58. ^ "Manual de mantenimiento y reparación del depósito de computadoras modelo 990/12 LR" (PDF) . Bitsavers.org . Instrumentos Texas . Consultado el 15 de febrero de 2024 .
  59. ^ Guía del programador del sistema de desarrollo de microcódigo MDS-990 de la computadora Texas Instruments modelo 990 (edición del 15 de agosto de 1979). Archivos de Texas Instruments, acceso RG-20 94-08, Cuadro 10, 45C. Biblioteca DeGolyer, Universidad Metodista del Sur, Dallas, TX, EE. UU.{{cite book}}: CS1 maint: location (link)

Otras lecturas

enlaces externos