Saltar al contenido

El diálogo CPU-periférico

El controlador que hay detrás de cada dispositivo, el recorrido completo de una interrupción desde que se pulsa una tecla, y las tres maneras de sincronizar una CPU rápida con un periférico lento.

El controlador: quién habla de verdad con la CPU

La CPU no habla con el teclado, ni con el disco, ni con la impresora. Habla con el controlador de ese dispositivo, que es un chip situado en la placa base (o en una tarjeta de expansión) y que hace de traductor entre dos mundos muy distintos: por un lado el bus del sistema, rápido y digital, y por otro un aparato mecánico, óptico o eléctrico que funciona a su ritmo.

Un controlador se compone de dos cosas: un juego de registros a los que la CPU escribe y lee, y firmware, que es el programa grabado en el propio chip con la lógica de entrada y salida. Ese firmware vive en memoria ROM, pero en la práctica es ROM actualizable: por eso existen las actualizaciones de firmware de un SSD o de una impresora.

RegistroQuién escribePara qué sirve
ControlLa CPUOrdenar la operación: lee, escribe, expulsa, rebobina
EstadoEl controladorDecir si está ocupado, si terminó o si hubo error
DatosLos dos, según el sentidoDepositar el byte que se transfiere

La relación no es uno a uno en el sentido que suele suponerse: un mismo controlador puede atender a varios dispositivos físicos conectados a él, y el dispositivo es la parte que se ve y se enchufa, mientras que el controlador es la parte que está integrada en la máquina.

Controlador es hardware: el chip con sus registros y su firmware. Driver o controlador de dispositivo en el sentido de Windows es software: el código que el sistema operativo ejecuta para manejar ese chip. El castellano usa la misma palabra para las dos cosas y en examen se juega con ello.

Para el examen

  • Controlador (hardware): el chip con registros de control, estado y datos, más su firmware

  • Driver (software): el programa del sistema operativo que lo maneja

El recorrido de una pulsación de tecla

La interrupción es el mecanismo por el que un periférico consigue que la CPU le atienda sin que la CPU tenga que estar pendiente de él. Conviene aprenderse el recorrido completo con un caso concreto, porque todos los demás funcionan igual.

Se pulsa la tecla

El hecho físico llega al controlador de teclado, que registra qué tecla ha sido.

El controlador levanta la IRQ

Su línea de petición de interrupción va conectada al controlador programable de interrupciones, el PIC.

El PIC obtiene el vector

Traduce la línea a un número de interrupción (09h para el teclado) y con él localiza en la tabla de la RAM la rutina que hay que ejecutar.

La CPU atiende y vuelve

Termina la instrucción en curso, guarda su estado, ejecuta la rutina (la ISR) y regresa exactamente donde estaba.

SiglaQué significaQué es en una frase
IRQInterrupt ReQuestLa petición de atención que lanza el dispositivo
PICProgrammable Interrupt ControllerEl chip que recoge todas las IRQ, las prioriza y avisa a la CPU
Offset o vector de interrupciónNo es acrónimoEl índice dentro de la tabla de la RAM que localiza la rutina; para el teclado, 09h
ISRInterrupt Service RoutineLa rutina que atiende la interrupción, es decir, el driver

Esa tabla de la RAM es lo que se llama tabla de vectores de interrupción, y ocupa una zona reservada de memoria. Una interrupción puede además llevar parámetros, que es como el sistema operativo sabe qué se le está pidiendo exactamente.

IRQ, vector e ISR son tres cosas encadenadas y distintas: la IRQ es el cable, el vector es el número que sirve de índice, y la ISR es el código que finalmente se ejecuta.

Para el examen

  • IRQ: la petición de interrupción que lanza el dispositivo

  • PIC: prioriza las peticiones y avisa a la CPU

  • Vector de interrupción: índice en la tabla de la RAM; el del teclado es el 09h

  • ISR: la rutina que atiende la interrupción

Interrupciones software, traps y excepciones

No todas las interrupciones vienen de un cable. La propia CPU genera interrupciones cuando algo ocurre durante la ejecución de una instrucción: una división por cero, un acceso a una página de memoria que no está cargada, una instrucción privilegiada ejecutada desde modo usuario. Esas se llaman excepciones o traps, y aunque su origen es interno, se atienden con la misma maquinaria: se busca un vector y se ejecuta su rutina.

Un programa también puede provocar una interrupción a propósito. Es la forma clásica de pedirle un servicio al sistema operativo, porque cambiar de modo usuario a modo núcleo requiere un punto de entrada controlado. En MS-DOS ese punto era la interrupción 21h, y en Linux sobre x86 de 32 bits fue durante años la 80h.

TipoDe dónde vieneEjemplo
Interrupción hardwareDe un dispositivo, por su línea IRQEl teclado avisa de una pulsación
Excepción o trapDe la propia CPU, al ejecutar una instrucciónDivisión por cero o fallo de página
Interrupción softwareDe un programa, que la provoca de forma deliberadaUna llamada al sistema con INT 80h

Para el examen

  • Interrupción hardware: la lanza el dispositivo

  • Excepción o trap: la genera la CPU al ejecutar: división por cero, fallo de página

  • Interrupción software: la provoca el programa: INT 21h en MS-DOS, INT 80h en Linux

Del PIC clásico al APIC y a MSI

El esquema del PIC con líneas físicas de interrupción es el de los primeros PC y tenía un problema evidente: las líneas eran pocas, así que había que compartirlas entre tarjetas y esos conflictos de IRQ eran una avería habitual. Además, con un solo PIC no hay forma razonable de repartir las interrupciones entre varios núcleos.

El sustituto es el APIC, controlador avanzado de interrupciones, que se reparte en dos piezas: un APIC local dentro de cada núcleo y uno o varios APIC de entrada y salida en el chipset. Así una interrupción se puede dirigir a un núcleo concreto. Su extensión x2APIC amplía el espacio de identificadores para máquinas con muchos núcleos.

En PCI Express se da un paso más y desaparece el cable de interrupción: con MSI, y su versión ampliada MSI-X, el dispositivo señaliza la interrupción escribiendo un dato en una dirección de memoria predeterminada. Eso elimina los conflictos por línea compartida y permite que una misma tarjeta tenga muchos vectores distintos, uno por cola de trabajo.

Si en un enunciado aparece «línea de interrupción compartida», se está hablando del modelo antiguo con PIC. Con MSI no hay línea que compartir.

Para el examen

  • PIC clásico: el controlador programable de interrupciones original

  • APIC: local por núcleo más un APIC de entrada/salida

  • MSI y MSI-X: en PCI Express señalizan escribiendo en memoria, sin línea física

Polling, interrupciones y DMA

Una CPU trabaja en nanosegundos y un disco o un teclado en milisegundos. Sincronizar esos dos ritmos admite tres soluciones, y se distinguen por quién toma la iniciativa y por cuánta CPU se gasta.

TécnicaQuién preguntaCosteCuándo se usa
Polling o encuestaLa CPU, que consulta el estado del dispositivo cada cierto tiempoAlto: gasta ciclos en preguntar aunque no haya nadaTécnica antigua; queda en sistemas muy simples o cuando la respuesta es inmediata
InterrupcionesEl dispositivo, que avisa cuando tiene algoBajo mientras no pasa nada, pero la CPU mueve cada datoEl modelo general de un sistema operativo
DMANadie: un controlador dedicado mueve los datos por su cuentaMínimo: la CPU solo interviene al principio y al finalTransferencias grandes: disco, red, tarjeta gráfica

DMA significa acceso directo a memoria. El dispositivo escribe o lee la memoria principal sin pasar por la CPU: esta solo programa la transferencia (dirección de origen, destino y tamaño) y recibe una interrupción cuando ha terminado. El precio es que, mientras eso ocurre, la memoria está siendo modificada a espaldas de la CPU, así que pueden aparecer problemas de coherencia con la caché si no se invalidan las líneas afectadas.

Las interrupciones evitan que la CPU pregunte; el DMA evita además que la CPU transporte. Son dos ahorros distintos y compatibles: una transferencia por DMA termina precisamente con una interrupción.

Para el examen

  • Polling: pregunta la CPU una y otra vez

  • Interrupciones: avisa el dispositivo cuando está listo

  • DMA: un controlador dedicado mueve los datos y avisa al terminar

Puertos de E/S, y la diferencia entre caché, buffer y spool

Para dirigirse a los registros de un controlador, la arquitectura x86 dispone de un espacio de direcciones separado del de la memoria, el espacio de puertos de entrada y salida, al que se accede con dos instrucciones específicas: IN para leer y OUT para escribir. El teclado es el ejemplo de manual, con dos puertos: uno de estado y control y otro de datos.

Puerto del tecladoPara qué
64hEstado y control del controlador de teclado
60hDato: el código de la tecla

Esa no es la única forma de llegar a un dispositivo. La alternativa, y la habitual hoy en PCI Express, es la entrada y salida mapeada en memoria: los registros del controlador se asoman dentro del espacio de direcciones de la memoria, de modo que se leen y escriben con las instrucciones normales de acceso a memoria y no hacen falta instrucciones especiales.

Alrededor de la transferencia aparecen tres palabras que se confunden constantemente y que no significan lo mismo.

TérminoQué guardaPara qué
CachéCopias de datos ya usadosVolver a servirlos sin ir al dispositivo lento
BufferDatos en tránsitoAmortiguar la diferencia de velocidad entre quien produce y quien consume
SpoolTrabajos completos, normalmente en discoEncolar peticiones para un dispositivo de un solo uso a la vez, como la cola de impresión

La caché apuesta a que el dato volverá a hacer falta; el buffer solo iguala ritmos y se vacía; el spool guarda el trabajo entero para servirlo por turnos.

Para el examen

  • Puertos del teclado: 64h estado y control, 60h dato

  • Instrucciones de E/S: IN lee y OUT escribe

  • Alternativa: entrada/salida mapeada en memoria

  • Caché, buffer y spool: la caché reutiliza, el buffer iguala ritmos y el spool encola trabajos completos