Procesadores

Microcódigo en un procesador ¿Qué es? ¿Cómo soluciona los problemas en CPU?

Con las vulnerabilidades de hardware, el microcódigo ha pasado de estar en un segundo plano a estar en boca de todos. Sin embargo, aún sigue siendo misterioso para muchos, y eso es lo que intentaremos solucionar aquí, contándote todo lo que tienes que saber sobre este código y cómo afecta a tu CPU.

Te recomiendo leer también sobre qué es el firmware, ya que está estrechamente relacionado

Introducción a la unidad de control de una CPU

unidad de control

La Unidad de Control (UC) es el centro de un procesador. Es el componente encargado de coordinar y gestionar todas las operaciones internas de la CPU, es decir, de controlar qué es lo que tiene que hacer cada una de las unidades funcionales según la instrucción del programa que se está ejecutando.

De esta forma, asegurando que cada instrucción se ejecute de manera secuencial y correcta. En esencia, la UC es la que «dirige el tráfico» dentro del procesador, determinando qué datos se deben mover, cuándo y hacia dónde. Por ejemplo, imagina que llega una instrucción a la CPU de suma:

ADD AX, BX

Esto, en un x86, significaría que se debe sumar el contenido almacenado en el registro BX de la CPU al contenido del registro AX, y almacenar el resultado en AX. Para que esta instrucción se pueda ejecutar, la unidad de control tendrá que:

  1. Durante el ciclo Fetch la unidad de control consigue la instrucción, en este caso ADD o suma.
  2. Luego le enviará señales de control a la ALU para que realice la operación aritmético-lógica, en este caso una suma aritmética de dos valores binarios.
  3. Además, según el código de esta instrucción, le indicará a la ALU que los dos valores que debe sumar son los que están almacenados en AX y BX, para que pueda realizar la operación.
  4. Una vez se obtiene el resultado, la unidad de control enviará una señal al registro AX para admitir una escritura, y así se escribe el resultado en AX.
  5. Después de eso, dará por finalizada la operación y atenderá a la siguiente instrucción del programa.

Es decir, la unidad de control es como el director de la orquesta, que irá indicando los pasos que las unidades tienen que realizar, como indicar a los registros que tendrán un acceso de lectura o escritura, decirle a la ALU o FPU si tiene que realizar una suma, multiplicación, etc. Y finalmente, también indicar lo que se hace con el resultado. Todo ello dependerá también de los modos de direccionamiento que la CPU admita y de la propia instrucción en sí.

También se encargará de cuestiones relacionadas con la seguridad, diferenciando entre código privilegiado (modo kernel) y código no privilegiado (modo usuario). E incluso gestionará otras operaciones como las excepciones, interrupciones, etc.

También te podría interesar conocer los mejores procesadores del mercado

UC cableada vs programada

La UC, históricamente, se han utilizado dos enfoques principales para su implementación:

  • UC cableada: es un diseño estático, donde las secuencias de control están implementadas directamente en hardware, utilizando circuitos lógicos como compuertas AND, OR, NOT y flip-flops (lógica, sin memoria). Es decir, las conexiones entre los componentes están «cableadas» de manera fija para realizar las operaciones deseadas según la instrucción. Este tipo de unidad tiene grandes ventajas, como su alto rendimiento y gran eficiencia energética. Solía estar en los RISC, dada su mayor simplicidad, aunque los complejos RISC actuales ya no la usan. No obstante, no todo eran ventajas, también tiene desventajas como su rigidez a la hora de modificar el comportamiento, ya que un cambio significará fabricar un chip de CPU nuevo.
  • Programada: utiliza un microprograma almacenado en una memoria de solo lectura (ROM) para controlar el funcionamiento del procesador. Este microprograma contiene una secuencia de microinstrucciones que especifican las acciones a realizar para cada instrucción del conjunto de instrucciones del procesador. Es decir, las instrucciones serán traducidas en una serie de señales de control para controlar el resto de unidades funcionales y que se haga lo que se espera de ellas. Estas unidades ocupan mayor superficie en el silicio que las cableadas, además de ser más complejas, menos rápidas y menos eficientes. Sin embargo, no todo es malo, ya que también tiene su lado positivo, y es su mayor flexibilidad a la hora de actualizar el microcódigo o realizar modificaciones de cualquier tipo, incluso admitir instrucciones nuevas.

Actualmente, tanto los CISC como los RISC (incluso algunas GPUs) suelen tener unidades programadas, dada la complejidad de los actuales sistemas. Además, el microcódigo ni siempre está en una ROM dentro de la CPU, también puede estar instalada en otras partes del firmware del sistema, como en el BIOS/UEFI, y durante el arranque, el microcódigo se cargará para que la CPU pueda funcionar. Así se permite que pueda ser modificado sin necesidad de fabricar un chip diferente.

Es decir, el BIOS/UEFI puede emitir actualizaciones del microcódigo durante el arranque de tu sistema, e incluso también el propio sistema operativo puede hacer ajustes en el microcódigo de la CPU, mediante actualizaciones del firmware. Por tanto, las nuevas unidades no son tan «rígidas» como las que usaban una memoria ROM de solo lectura, sino que tienen una memoria tipo flash donde se carga el microcódigo durante el arranque de la máquina.

Esto es gracias a un mecanismo de instrucciones llamado RDMSR (Read Model-Specific Register) y WRMSR (Write Model-Specific Register). Estas instrucciones permiten al software leer y escribir directamente en registros especiales del procesador, conocidos como registros específicos del modelo (MSR). Estos registros contienen información crucial sobre el estado del procesador, sus características y configuraciones que, por lo general, no están expuestas a través de las instrucciones estándar del conjunto de instrucciones (ISA).

Pensarás que para que esto funcione, debe estar el microcódigo cargado en la CPU, puesto que no podría hacer nada sin él, pero la verdad es que siempre hay un microcódigo dentro de la CPU, uno básico que pueda ejecutar las instrucciones necesarias para el arranque, y cargar las actualizaciones. Esto quiere decir que, los procesadores no funcionarán conforme a las nuevas actualizaciones cuando el código debe ser cargado desde el BIOS/UEFI durante el arranque, y empezarán ha hacerlo una vez el microcódigo se ha cargado.

¿Qué es el microcódigo?

ROM microcódigo

El microcódigo es un código básico, un programa elemental que se almacena en una memoria y actúa a muy bajo nivel, es decir, un firmware para la CPU. Por tanto, actúa como un puente entre el hardware y la ISA, y por tanto, el software. Es un conjunto de instrucciones de bajo nivel que definen cómo un procesador ejecuta instrucciones de código máquina de alto nivel.

Gracias a este microcódigo, la unidad de control sabrá cómo se trata cada instrucción, o mejor dicho, qué se hace al recibir cada instrucción. Por tanto, se puede decir que es una forma de cambiar el modo de comportarse de un procesador.

Por otro lado, existen varios tipos de microcódigo, como el horizontal y el vertical. Mientras que el horizontal genera señales de control para múltiples unidades funcionales, el vertical controlará una sola unidad.

¿Cómo puede una actualización de microcódigo solucionar problemas?

microcódigo

Ahora que ya conoces qué es el microcódigo y para qué sirve, es momento de contestar a la pregunta del título. ¿Cómo una actualización de microcódigo puede solucionar los problemas? Pues bien, cuando se aplica un parche, puede contribuir a:

  • Mejoras en el rendimiento: aunque la ISA y la CPU no cambie a nivel físico, se puede optimizar el rendimiento con ayuda de actualizaciones de microcódigo, por ejemplo, modificando el orden o simplificando el proceso.
  • Corrección de errores: si existen bugs o vulnerabilidades que estén afectando a los resultados o seguridad del sistema, un parche de microcódigo puede hacer que al ejecutar las instrucciones conflictivas, o se limitan los privilegios de acceso, se genera una señal para borrar una memoria con datos sensibles, se lleve a cabo un proceso diferente o que genere algunas restricciones, para así solucionar el problema. No obstante, esto puede hacer que la unidad de vuelva más lenta, ya que no es lo óptimo para la microarquitectura.
  • Otros: una actualización de microcódigo también puede agregar soporte para nuevas tecnologías o nuevas instrucciones de la ISA. No obstante, para que esto sea posible, el hardware o la microarquitectura en sí debe poder adaptarse y procesar dichas instrucciones sin cambios físicos.

Por ejemplo, la vulnerabilidad Spectre explotaba una debilidad en la forma en que los procesadores con ejecución especulativa ejecutaban instrucciones. Para corregir esta vulnerabilidad, las actualizaciones de microcódigo introdujeron cambios en la forma en que el procesador manejaba la ejecución especulativa, evitando que los atacantes de canal lateral pudieran aprovechar esta característica para acceder a información confidencial almacenada en la memoria caché.

Comenta todas tus dudas, impresiones, sugerencias, etc.

Isaac

Geek de los sistemas electrónicos, especialmente del hardware informático. Con alma de escritor y pasión por compartir todo el conocimiento sobre tecnología.
Los datos de carácter personal que nos facilite mediante este formulario quedarán registrados en un fichero de Miguel Ángel Navas Carrera, con la finalidad de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento del interesado. Si no se acepta no podrás comentar en este blog. Puedes consultar Política de privacidad. Puede ejercitar los derechos de acceso, rectificación, cancelación y oposición en info@profesionalreview.com
Botón volver arriba