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 x e y para después codificarse y transmitir dicho movimiento al ordenador, el cual recreaba el moviento en los ejes x y z
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
Características generales
Los discos giran a una velocidad constante entre 5400rpm y 15000rpm
Diametro de 3.5 pulgadas (~9cm)
Tiempo de acceso: 5ms a 20ms
Gran capacidad: Terabytes
Coste por bit: ∼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)
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 0 es el exterior)
H → Número de cara [0, totalCaras-1](💡 La cara 0 es la superior)
S → Número de sector [1, SectoresPorPista](⚠️ El primero es 1, 💡 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 0)
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×SpT×NC×HpC
💡
En la dirección (CHS) 0/0/1 se encuentra la master boot recordy 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 CHSCapacidad 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 0)
ℹ️
Este direccionamiento enumera de los diferentes sectores en el siguiente orden:
Cilindro 0 (exterior) del cabezal 0 (superior) → 0/0/k
Cilindro 0 (exterior) del cabezal l (superior) → 0/l/k
Cilindro m (exterior) del cabezal l (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+1
➗
Calculo CHS → LBA
LBA=(C×HpC+H)×SpT+(S−1)
Algunos datos importantes
÷ → 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)
Tiempo que tarda la aguja en desplazarse a un cilindro desde el cilindro actual
Latencia rotacional (Tr)
Tiempo que tarda en rotar el disco hasta llegar al sector deseado. El tiempo que tarda en dar una vuelta se calcula usando las rpm del disco
Tiempo de transferencia (Tt)
Tiempo de transferencia, tiempo que tarda el leer el sector entero
Tiempo de controlador (Tc)
Tiempo que tarda el driver en procesar los datos leidos (despreciable)
Tiempo de acceso=Tb+Tr+Tt+Tc
💡
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
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)
Se salta al modo kernel
Interrumpe la ejecución del proceso actual
Guarda el contexto del proceso actual (valor de PC y otros registros)
Inhibe el resto de interrupciones (salvo para interrupciones anidadas)
Carga en el registro PC la dirección de la RTI
Ejecuta la RTI
Ejecución de la RTI
Informar del reconocimiento de la interrución
Desactivar la señal de petición de interrupción
Guardar todos los registros que van a ser sobreescritos
Realiza las operaciones de E/S
Restaura el valor original de los registros guardados
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
Ejecución con parada de CPU (ráfaga)
Se detiene la ejecución del programa para ejecutar varias operaciones DMA seguidas (ráfaga)
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
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
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
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 0 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
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ónBranch 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 0 (floats)
16
FPOV
Overflow aritmético (floats)
17
FPUN
Subdesbordamiento aritmético (floats)
EPC($14)
ℹ️
Contiene la direcciónde la instrucción que al ejecutarse, ha producido la excepción
ℹ️
Cuando se produce una excepción, se realiza automáticamente lo siguiente:
Se copia el valor de PC(instrucción siguiente)a EPC
Se actualiza el registro Cause
Se escribe el código de excepción
Activar el bit de instrucción pendiente correspondiente (si es una interripción)
Activar el bit EXL del registro Status(esto inhive el resto de excepciones)
Se activa el modo kernel (en MARS, esto no ocurre, se ejecuta en modo user sin restricciones)
Se copia 0x80000180 (manejador de excepciones)en PC