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.
| Registro | Quién escribe | Para qué sirve |
|---|---|---|
| Control | La CPU | Ordenar la operación: lee, escribe, expulsa, rebobina |
| Estado | El controlador | Decir si está ocupado, si terminó o si hubo error |
| Datos | Los dos, según el sentido | Depositar 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.
| Sigla | Qué significa | Qué es en una frase |
|---|---|---|
| IRQ | Interrupt ReQuest | La petición de atención que lanza el dispositivo |
| PIC | Programmable Interrupt Controller | El chip que recoge todas las IRQ, las prioriza y avisa a la CPU |
| Offset o vector de interrupción | No es acrónimo | El índice dentro de la tabla de la RAM que localiza la rutina; para el teclado, 09h |
| ISR | Interrupt Service Routine | La 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.
| Tipo | De dónde viene | Ejemplo |
|---|---|---|
| Interrupción hardware | De un dispositivo, por su línea IRQ | El teclado avisa de una pulsación |
| Excepción o trap | De la propia CPU, al ejecutar una instrucción | División por cero o fallo de página |
| Interrupción software | De un programa, que la provoca de forma deliberada | Una 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écnica | Quién pregunta | Coste | Cuándo se usa |
|---|---|---|---|
| Polling o encuesta | La CPU, que consulta el estado del dispositivo cada cierto tiempo | Alto: gasta ciclos en preguntar aunque no haya nada | Técnica antigua; queda en sistemas muy simples o cuando la respuesta es inmediata |
| Interrupciones | El dispositivo, que avisa cuando tiene algo | Bajo mientras no pasa nada, pero la CPU mueve cada dato | El modelo general de un sistema operativo |
| DMA | Nadie: un controlador dedicado mueve los datos por su cuenta | Mínimo: la CPU solo interviene al principio y al final | Transferencias 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 teclado | Para qué |
|---|---|
| 64h | Estado y control del controlador de teclado |
| 60h | Dato: 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érmino | Qué guarda | Para qué |
|---|---|---|
| Caché | Copias de datos ya usados | Volver a servirlos sin ir al dispositivo lento |
| Buffer | Datos en tránsito | Amortiguar la diferencia de velocidad entre quien produce y quien consume |
| Spool | Trabajos completos, normalmente en disco | Encolar 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