Tema 5 - Periféricos y Técnicas de gestión de E/S

Periféricos


Introducción

📖
La unidad de entrada/salida es la encargada de comunicar el ordenador con el exterior a través de los periféricos (ratón, teclado, pantalla, micrófono, altavoz, …)
📖
Los periféricos son aquellos dispositivos que permiten al ordenador comunicarse con el exterior, ya sea con un humano o con otro dispositivo. Podemos diferenciar los siguientes tipos
  • Periféricos de entrada
  • Periféricos de salida
  • Periféricos de entrada/salida
  • Periféricos de almacenamiento
🤖
La CPU puede comunicarse con los periféricos a través del controlador de los mismos. Este controlador cuenta con:
  • Registro de control → Para recivir ordenes de la CPU
  • Registro de estado → Donde puede comunicar a la CPU en estado en que se encuentra el dispositivo
  • Registro de datos → Donde puede mandar la información generada por el periférico hacia la CPU
Otras características de los controladores
  • Control y temporización del flujo de datos
  • Reconocimiento de la dirección del dispositivo
  • Almacenamiento temporal de datos (buffer)
  • Detección de errores en la transferencia
🛰️
Polling (sondeo)
El polling es el nombre que recive la acción periódica de un procesador de consultar a los controladores si hay datos para leer

Ratón

🖱️
Este dispositivo se inventó a finales de los 60 por Douglas Engelbart. El aparato tenía tres botones (btn. principal, secundario, rueda). Inicialmente, estos contaban con una rueda que en contacto con una superficie, esta giraba, en su interior, unos aparatos capturaban la rotación en el eje xx e yy para después codificarse y transmitir dicho movimiento al ordenador, el cual recreaba el moviento en los ejes xx y zz

Disco duro magnético (Hard Drive Disk)

💽
Este dispositivo permite el almacenamiento masivo de datos, con gran fiabilidad.
 
Este consta un cierto número de platos/discos de doble cara las que llamaremos caras (heads). Cada una de estas cabezas está dividida en pistas (tracks), que són circunferencias concentricas respecto del centro del la cara. A su vez, estas pistas se dividen en sectores
 
La información es leida por la aguja situada junto a la cara donde se ubica el dato que queremos leer
Imágen
notion image
Características generales
  • Los discos giran a una velocidad constante entre 5400rpm5400\text{rpm} y 15000rpm15000\text{rpm}
  • Diametro de 3.5 pulgadas (~9cm)
  • Tiempo de acceso: 5ms5\text{ms} a 20ms20\text{ms}
  • Gran capacidad: Terabytes
  • Coste por bit: 0.5/GB\sim 0.5€/GB
💡
La diferencia entre cilindros (cylinders) y pistas (tracks) es que el cilindro es el número de pistas de una única cara (este número no cambia si añadimos más discos). Mientras que las pistas se refiren a una circunferencia concreta de una cara (si añadimos más discos, tendremos más pistas totales)
notion image

Direccionamiento de un disco duro

Direccionamiento CHS (Cylinder-Head-Sector)

📖
El direccionamiento CHS sirve para localizar un dato en en disco duro. Este dato se encontrará en un cilindro concreto (cilinder (C)), en una cara/cabezal concreto (head (H)) y en un sector determinado (sector (S)).
ℹ️
Una coordenada en este direccionamiento se expresa como C/H/S siendo estos:
  • C → Número de cilindro [0, totalCils-1] (💡 El cilindro 00 es el exterior)
  • H → Número de cara [0, totalCaras-1] (💡 La cara 00 es la superior)
  • S → Número de sector [1, SectoresPorPista] (⚠️ El primero es 11, 💡 incrementa en el sentido de las agujas del reloj)
💡
Estas coordenadas también se usar para denotar la geometría del dispositivo siendo 4/4/8 (4 sectores - 4 caras - 8 sectores). Debemos tener el cuenta que la dirección máxima será 3/3/8 (dado que los cilidros y las caras empiezan por 00)
Algunos datos importantes
  • SpT (sectors per track) → Número de sectores por pista
  • HpC (heads per cylinder) → Número de caras totales (discos*2)
  • NC (number of cylinders)Número de cilindros
  • SS (sector size) → Tamaño del sector en bytes
  • Capacidad total de un disco duro → SS ×\times SpT ×\times NC ×\times HpC
💡
En la dirección (CHS) 0/0/1 se encuentra la master boot record y la tabla de particiones del disco
Sin embargo, aunque hoy en día los dispositivos de almacenamiento no contengan discos, estos aceptan valores CHS que serán transformados a la dirección correspondiente
🔴
Desventajas del direccionamiento CHS
Capacidad máxima de 8GB (7.84GiB)
Esta limitación es cosa del pasado, dado que se consideraba que esa el la capaciadad máxima que se podía conseguir al no poder incrementar la capacidad en cuanto a número de heads, de sectores en una pista, …
Pone al descubierto la geometría del dispositivo
Esta desventaja supone que el dispositivo está basado en discos, y además requiere que conozcamos las características de este para poder introducir los valores adecuados.
 
Las soluciones actuales trantan al dispositivo como una caja negra

Direccionamiento LBA (Logical Block Addressing)

📖
Este direccionamiento (virtual/lógico) viene a solucionar los problemas del CHS al encapsular la geometría del dispositivo en una única dirección secuencial (desde el 00)
ℹ️
Este direccionamiento enumera de los diferentes sectores en el siguiente orden:
  • Cilindro 00 (exterior) del cabezal 00 (superior) → 0/0/k
  • Cilindro 00 (exterior) del cabezal ll (superior) → 0/l/k
  • Cilindro mm (exterior) del cabezal ll (superior) → m/l/k
💡
Al encapsular la posición física de un dato, podemos reasignar sectores defectuosos
Calculo LBA → CHS
C=LBA÷(HpC×SpT)H=(LBA÷SpT)modHpCS=LBAmodSpT+1C = LBA \div (HpC \times SpT)\\ H = (LBA \div SpT) \bmod HpC \\ S = LBA \bmod SpT + 1
Calculo CHS → LBA
LBA=(C×HpC+H)×SpT+(S1)LBA = (C \times HpC + H) \times SpT + (S-1)
Algunos datos importantes
  • ÷\div → División entera
  • SpT (sectors per track) → Número de sectores por pista
  • HpC (heads per cylinder) → Número de caras totales (discos*2)
  • C , H , S → Cilindro, Cara, Sector
  • LBA → Dirección en el direccionamiento LBA

Tiempos de acceso de un disco duro

El tiempo de acceso se calcula como la suma de los siguientes tiempos
Tiempo de búsqueda (Tb)(T_b)
Tiempo que tarda la aguja en desplazarse a un cilindro desde el cilindro actual
Latencia rotacional (Tr)(T_r)
Tiempo que tarda en rotar el disco hasta llegar al sector deseado. El tiempo que tarda en dar una vuelta se calcula usando las rpmrpm del disco
Tiempo de transferencia (Tt)(T_t)
Tiempo de transferencia, tiempo que tarda el leer el sector entero
Tiempo de controlador (Tc)(T_c)
Tiempo que tarda el driver en procesar los datos leidos (despreciable)
Tiempo de acceso=Tb+Tr+Tt+Tc\bold{\textbf{Tiempo de acceso} = T_b + T_r + T_t + T_c}
💡
El tiempo de acceso a un dato es variable ya que depende de la posición inicial de la aguja respecto de la posición del dato

Disco duro de estado sólido (Solid State Drive)

💽
Este dispositivo de almacenamiento masivo es una alternativa a los HDD
 
Estos están basados en semiconductores (MOSFET) en lugar de discos que rotan y campos magnéticos.
🟢
Las ventajas de estos discos duros son:
  • No tienen partes móviles
  • Más resistentes
  • Más rápidos
  • Acceso a los datos en tiempo constante
  • No hacen ruido
🔴
Desventajas
  • Más caros
  • Menor vida util
  • Menor capacidad
 
De este tipo de memorias, surgen unas que se conocen como memorias flash, de las que existen dos tipos (los nombres vienen dados por su organización interna)
  • NOR → Estas memorias se leen de bit a bit (1-bit)
  • NAND → Estas unidades se leen en bloques de 16 o 32 bits (32-bit)

Disquete (floppy-disk)

💾
Estos eran similares a los HDD pero más pequeños y con menor capacidad. Su capacidad era de 1.44MB (el cálculo de este valor utiliza un híbrido de base decimal y binaria)

Gestión de las operaciones de E/S


🤖
El Sistema Operativo (SO)
El SO hace de interfaz entre los procesos y los periféricos, impidiendo que estos puedan acceder directamente a ellos
Funciones de SO
  • Gestionar los permisos de acceso
  • Abstraer los detalles de la comunicación con los periféricos
  • Gestionar las interrupciones
  • Garantizar el acceso de los recursos (redistribuyendo la capacidad de computo entre los diferentes procesos)
Comunicación SO ↔ Periféricos
  • El SO envia señales de control a los periféricos
  • Los periféricos notifican al SO cuando se completa una operación
  • Transferencia de datos entre el SO y los periféricos
Direccionamiento de los periféricos
Direccionamiento de los periféricos
El porcesador puede comunicarse con los periféricos a través de una dirección asociada a estos. Dicha dirección se publica en el bus de direcciones para informar al periférico que se requiere que este realize alguna operación.
 
El espacio de direcciones puede ser:
Un espacio de direcciones propio → Para acceder a un dato se hace uso de una dirección en un espacio a parte de la memoria principal. Para consultar una de estas direcciones se hace uso de una instrucción especial para la comunicación con periféricos: input (lw) y ouptut (sw)
Ejm: Familia Intel x86
Espacio compartido con la memoria principal → Esto quiere decir que algunas direcciones se reservarán para la comunicación con periféricos. Por lo que al llamar a lw y sw junto con alguna de estas direcciones, no se hará uso de la memoria sino que se comunicará con en el dispositivo correspondiente (la memoria ignora la operación cuando detecta estas direcciones)
Ejm: MIPS, Motorola M68000, MOS Technology 6502
🚦
Técnicas de gestión de E/S
Veremos tres técnicas de gestión de E/S (Entrada/Salida, en inglés I/O)

Polling

🔁
En la técnica de sondeo/encuesta, el procesador consulta periodicamente a los periféricos para ver si los registros de estado informan de que el dispositivo tiene información, y en ese caso, se hace otra consulta al registro de datos. Esto puede dar lugar a tiempos de espera excesivos por parte del procesador durante la ejecución de este procedimiento.
 
Este es el método sencillo pero menos eficiente
 

Interrupciones

🛑
Las interrupciones son un suceso asíncrono que se produce como consecuencia de un evento externo.
 
Cuando se produce una interrupción, el procesador termina de ejecutar la instucción actual, y ejecuta la subrutina correspondiente para atender la interrupción.
🟢
Las interrupciones no suponen una carga de trabajo relevante al procesador, ya que solo se deriva el flujo de trabajo cuando ocurren
🔝
Prioridad de las interrupciones
Las instrucciones tienen una jerarquía de prioridades por lo que primero se resuelven unas y luego otras. El nivel de atención establece la prioridad mínina de una interrupcción para que el procesador la gestione de inmediato. Dicho nivel de atención se almacena en un registro del procesor.
 
Cuando una interrupción tiene la prioridad suficiente para ser atendida de inmediato, se guarda el valor de los registros y se ejecuta la Rutina de Tratamiento de Instrucciones (RTI)
Antes de ejecutar la RTI (interrupción con suficiente prioridad)
  1. Se salta al modo kernel
  1. Interrumpe la ejecución del proceso actual
  1. Guarda el contexto del proceso actual (valor de PC y otros registros)
  1. Inhibe el resto de interrupciones (salvo para interrupciones anidadas)
  1. Carga en el registro PC la dirección de la RTI
  1. Ejecuta la RTI
 
Ejecución de la RTI
  1. Informar del reconocimiento de la interrución
  1. Desactivar la señal de petición de interrupción
  1. Guardar todos los registros que van a ser sobreescritos
  1. Realiza las operaciones de E/S
  1. Restaura el valor original de los registros guardados
  1. Finalizar la interrupcuión y volver al punto en el que surgió dicha interrupción
 
💡
Cuando una instrucción no tiene el nivel de prioridad suficiente, debe esperar a que este baje.
🪆
Las instrucciones anidadas permiten la ejecución de una interrupción dentro de otra si esta tiene mayor prioridad
 

DMA

Direct Memory Access (DMA)
A diferencia de las técnicas anteriores, donde el procesador era el encargado de gestionar la transferencia de datos entre la memoria y el periférico, en este caso el periférico tiene acceso directo a una región de la memoria de forma que la CPU queda libre de responsabilidades
 
La transferencia de datos queda en manos del controlador de DMA, el cual hace también de maestro del bus de datos
 
Este controlador hace uso de las interrupciones para informar al procesador del estado de una operación (finalización ó error), pero ya no es necesario que la CPU las atienda de inmediato
 
Operación a través del controlador de DMA
La CPU comunica al controlador de DMA
  • La operación que se va a realizar
  • La identidad del dispositivo
  • La dirección de inicio del bloque de memoria
  • Número de bytes que se van a transmitir
El controlador de DMA se encarga de:
  • Obtener el acceso al bus
  • Transferir los datos cuando estos están disponibles en el periférico
  • Gestionar memoría adicional si la transferencia requiere más espacio
⚙️
Configuraciones de DMA
Pueden ocurrir diferentes situaciones cuando se requiere que el procesador interactue con el controlador de DMA
Ejecución sin DMA
No hay operaciones DMA pendientes por lo que el procesador continua con el flujo normal del programa
notion image
Ejecución con parada de CPU (ráfaga)
Se detiene la ejecución del programa para ejecutar varias operaciones DMA seguidas (ráfaga)
notion image
Ejecución de DMA con robo de ciclo
Se intercala una operación DMA con una instrucción del programa. De esta forma no detenemos por completo el programa sino que solo se ralentiza ligeramente
notion image
Ejecución de DMA con bus compartido (DMA Transparente)
La CPU cede el control del BUS al DMA en los ciclos en lo que no lo vaya a usar
notion image
Ejecución de DMA con memoria multipuerta
Las memorias multipuerta permiten consultar múltiples direcciones a la vez (no se pueden solapar), por lo que se reserva una puerta para la CPU, y el resto para el DMA y otros controladores
🛎️
Atención a interrupciones
Las instrucciones se atienden al final del último ciclo de cada instrucción, se comprueba si hay instrucciones pendiente y si no, se ejecutan las siguiente instrucción con normalidad
notion image

Gestión de las interrupciones en MIPS32

ℹ️
En MIPS, una excepción es una situación que requiere atención inmediata del procesador. Estas pueden ser de varios tipos:
  • Excepciones internas → Errores de ejecución: desvordamiento, error de dirección, error de privilegio, error de paridad
  • Excepciones externas (interrupciones)→ Generadas por los periféricos, interrumpen la ejecución normal del proceso
  • Excepciones por llamadas al sistema → Llamadas a syscall
Cuando ocurre una excepción, el procesador realiza unas operaciones predefinidas, y luego ejecuta el manejador de excepciónes
⚙️
El manejador de excepciones es una rutina de servicio que se llama cuando ocurre una excepción el MIPS. Esta subrutina empieza exactamente en la dirección 0x80000180
 
Existen dos tipos de manejadores
  • Reentrante → Permite anidar excepciones
  • No reentrante → No permite anidar excepciones
    • Es necesario deshabilitar las interrupciones
 
Podemos definir nuestro propio manejador de excepciones usando la directiva .ktext 0x80000180 , a continuación escribimos en código, finalmente retornamos al valor de EPC con la instrucción eret
.ktext 
⚙️
Registros del coprocesador 00 en MIPS32
Este coprocesador contiene 32 registros que sirven para la configuración del sistema
Algunos de estos registros son:
VAddr ($8)
ℹ️
Cuando el acceso a una dirección a memoria produce una excepción, este registro contiene dicha dirección
 
Status ($12)
ℹ️
Registro de estado
  • Interrupt mask (IM) [15-8] → Umbral de prioridad de ejecución de las interrupciones
  • User mode (UM) 4Modo kernel (0), usuario (1)
  • Exception level (EXL) 1 → Procesador normal (0), procesador ejecutando excepción (1) (además IE=1)
  • Interrupt enable (IE) 0Interrupciones desahabilitadas (0), instrucciones habilitadas (1)
notion image
Los bits que no aparecen aquí pertenecen a la configuración relativa a si el sistema el big/little-endian, si hay más coprocesadores, interrupciones no enmascarables, …
💡
Los bits que no hemos descrito es por que estos no aparecen en el debugger del MARS.
 
Cause ($13)
ℹ️
Contiene la razón de porqué ha saltado la excepción
Branch delay DB - 31
ℹ️
Se activa si se produce una excepción entre el momento en el que se calcula si se debe hacer un salto (salto condicional) y el momento en el que finalmente se hace dicho salto
 
Esta es una situación que puede ocurrir debido a que el procesador puede realizar múltiples operaciones a la vez, así como ocurre con los ciclos solapados
Pending interrupts IP - [15-8]
ℹ️
Se activa el bit correspondiente si hay alguna interrupción pendiende de resolver de este nivel (este valor se actualiza sin importar el valor de la máscara)
 
Si quedan interrupciones pendientes, el procesador las resolverá antes de continuar con la ejecución del proceso (si la máscara lo permite)
Exception code ExcCode - [6-2]
Núm
Nombre
Descripción
0
IntL
Interrupción externa (periféricos)
4
AdEL
Interrupción por dirección erronea (lectura)
5
AdES
Interrupción por dirección erronea (escritura)
6
IBE
Error de bus en ciclo IF
7
DBE
Error de bus en ciclo MEM
8
Sys
Llamada a syscall
9
Bp
Breakpoint (debugger)
10
RI
Instrucción reservada
12
OV
Overflow aritmético
13
Tr
Trap (thrown exception by programmer)
15
FPE
División por 00 (floats)
16
FPOV
Overflow aritmético (floats)
17
FPUN
Subdesbordamiento aritmético (floats)
 
EPC ($14)
ℹ️
Contiene la dirección de la instrucción que al ejecutarse, ha producido la excepción
 
ℹ️
Cuando se produce una excepción, se realiza automáticamente lo siguiente:
  1. Se copia el valor de PC (instrucción siguiente) a EPC
  1. Se actualiza el registro Cause
    1. Se escribe el código de excepción
    2. Activar el bit de instrucción pendiente correspondiente (si es una interripción)
  1. Activar el bit EXL del registro Status (esto inhive el resto de excepciones)
  1. Se activa el modo kernel (en MARS, esto no ocurre, se ejecuta en modo user sin restricciones)
  1. Se copia 0x80000180 (manejador de excepciones) en PC