Práctica 6 - Entrada/Salida Organización del Computador 1 Verano 2010 Ejercicio 1 En una computadora ORGA1 se ha conectado un dispositivo de entrada en la dirección 0xFFF0. La forma de interpretar la palabra (de 16 bits = b15 . . . b0 ) provista por el dispositivo es la siguiente: El bit b15 representa el estado del dispositivo. Dicho bit se encuentra en 1 cuando el dispositivo está ocupado, y en 0 cuando está listo. Cuando el estado del dispositivo es “listo”, b7 . . . b0 contienen el dato proporcionado por el dispositivo. Escribir una rutina en assembler de ORGA1 que debe leer n datos del dispositivo y escribirlos en forma contigua a partir de una dirección de memoria utilizando polling. La rutina recibe en R0 la cantidad de datos a leer y en R1 la posición de memoria a partir de la cual debe escribir. Ejercicio 2 Se desea proveer a la arquitectura del procesador ORGA1 de la capacidad de atender la interrupción de un único dispositivo de E/S. Para ello: Se agrega una nueva señal de entrada llamada INT (Interrupción) y de salida INTA (Interrupción Reconocida). Se agrega un nuevo flag: I. Este flag indica: • con 1 que el procesador puede ser interrumpido y atender la interrupción del dispositivo • con 0 que el procesador no puede ser interrumpido Se reserva la dirección de memoria 0x0000 para almacenar la dirección de la rutina de atención de la interrupción del dispositivo de E/S. Se proveen 4 nuevas instrucciones: • CLI que coloca I=0 • STI que coloca I=1 • PUSH Ri , cuyo efecto es [SP]=Ri y luego SP=SP-1 • POP Ri , cuyo efecto es SP=SP+1 y luego Ri =[SP] Las señales INTR e INTA se conectan a este dispositivo de E/S. Si el dispositivo activa la señal de interrupción y el flag I vale 1, al terminar de ejecutar la instrucción en curso, el procesador realiza la siguiente secuencia de pasos: 1. Activa la señal INTA para indicarle al dispositivo que atenderá su pedido. 2. Coloca I=0 para evitar que el procesador vuelva a interrumpirse. 3. Coloca [SP]=PC, y decrementa el SP (SP=SP-1). 1 4. Coloca PC=[0x0000]. Luego de esto, comienza a ejecutarse la rutina de atención de la interrupción propiamente dicha. Sea el siguiente programa: main: noHuboOverflow: huboOverflow: MOV MOV ADD JVS ... ... ... R0, 0x8000 R1, 0xFFFF R0, R1 huboOverflow Y la siguiente rutina de atención de la interrupción: rutinaAtencionInt: ... ... PUSH R0 PUSH R1 MOV R0, 0x0000 MOV R1, 0x0000 ADD R0, R1 POP R1 POP R0 SETI RET ; salva el valor original de R0 ; salva el valor original de R1 ; ; ; ; restaura el valor original de R1 restaura el valor original de R0 habilita que se pueda interrumpir retorna a lo que estaba ejecutando Suponga que I=1 y en la dirección de memoria 0x0000 se encuentra efectivamente la dirección de la etiqueta rutinaAtencionInt a) ¿La ejecución del programa main continuará como se espera si el dispositivo de E/S activa la señal de interrupción durante el ciclo de ejecución de la instrucción ADD R0, R1? b) ¿Existe alguna limitación en el diseño actual del esquema de atención de la interrupción? Proponga alguna alternativa para superarla. Ejercicio 3 Una computadora ORGA1 se encuentra conectada a 3 dispositivos de E/S que actúan como sensores. Cada sensor posee un registro de E/S que reporta información climática. Los sensores son: Temperatura: Mide temperatura en grados celsius (TEMP STATUS) Presión Atmosférica: Mide presión en HectoPascales (ATM STATUS) Intensidad del Viento: Mide intensidad en Metros/Segundo (WIND SPEED) Las etiquetas MAX TEMP, MAX ATM, MAX WIND SPEED son constantes de 16 bits. a) Mapear los registros de E/S a direcciones de E/S de ORGA1 y completar el siguiente código: sensar: CMP [...], MAX_TEMP ;alcanzó temperatura máxima? JG alarma CMP [...], MAX_ATM ;alcanzó presión atmosférica máxima? JG alarma CMP [...], MAX_WIND_SPEED ;alcanzó velocidad máxima? JG alarma JMP sensar alarma: CALL sonarAlarma ;invoca rutina de alarma JMP sensar 2 b) Suponiendo que el ciclo de instrucción de cada instrucción del programa tarda t sg y los valores máximos nunca se alcanzan ¿cuál es la frecuencia (en Hz) de muestreo (lectura) de los registros de E/S? c) Suponga que el CPU cuenta con soporte para una interrupción. El sensor de temperatura solicita una interrupción si se alcanza la temperatura máxima. i. Modificar el programa presentado para aprovechar esta caracterı́stica de modo que la frecuencia de muestreo sea mayor. ii. Escribir la rutina de atención de la interrupción del sensor de temperatura. Ejercicio 4 Una computadora tiene tres dispositivos de E/S: una impresora, un disco y una lı́nea RS232 (puerto serial). Las prioridades de estos dispositivos son 2, 4 y 5 respectivamente (a mayor número, mayor prioridad). La CPU necesita 10 unidades de tiempo para atender una interrupción de la impresora, 8 para atender una interrupción del disco, y 7 para atender una interrupción de la lı́nea RS232. El procesador cuenta con una máscara de interrupciones de 16 bits. Si la máscara contiene al número n, esto significa que se atenderán todas las interrupciones con prioridad mayor o igual a n. La máscara inicial es 0000h. Cuando se está atendiendo un dispositivo de prioridad n, las interrupciones de menor prioridad son descartadas. Por otro lado, si se está atendiendo un dispositivo de prioridad n e interrumpe un dispositivo de prioridad mayor que n, la ejecución de la rutina actual se encola para su posterior tratamiento. Dada la siguiente secuencia de eventos, hacer un diagrama de tiempos mostrando a qué se dedica la CPU y cuál es la máscara de interrupciones en cada instante: 1) t = 10: la impresora envı́a un pedido de interrupción. 2) t = 15: la lı́nea RS232 envı́a un pedido de interrupción. 3) t = 20: el disco envı́a un pedido de interrupción. 4) t = 40: el disco envı́a un pedido de interrupción. Suponer que cuando la CPU no está atendiendo interrupciones se encuentra corriendo un programa de usuario. Ejercicio 5 Se ha desarrollado un prototipo para un nuevo modelo de microondas que será lanzado próximamente al mercado. Se utiliza para ello un microcontrolador que posee dos niveles de interrupciones enmascarables, uno de prioridad alta (HP) y otro de prioridad baja (LP). La rutina de atención de la interrupción HP se encuentra en la dirección de memoria 000008h y la rutina de atención de la interrupción LP se encuentra en la dirección 0000018h. Además, cuenta con un contador de programa (PC), un registro que apunta al tope de la pila (SP) y un registro de estado (PSW) de 8 bits en el cual • los bits del 0-3 son bits de estado de la ALU (C, Z, V, N), 3 • el bit 4 (HIE) habilita (1) o deshabilita (0) las interrupciones de prioridad alta, • el bit 5 (LIE) habilita (1) o deshabilita (0) las interrupciones de prioridad baja, • el bit 6 (IFH) y el 7 (IFL) indican si se produjo una interrupción de prioridad alta o de prioridad baja respectivamente (1 con interrupción - 0 sin interrupción ). Ante una interrupción, antes de dejar camino su rutina de atención, el microcontrolador inhibe las interrupciones (HIE=0 y LIE=0). En la lı́nea LP estarán conectados un Reloj de tiempo real (RTC) y un panel de control (CP) por lo tanto cualquiera de los dos puede generar una interrupción de prioridad baja. En la lı́nea HP tendrá un sensor de apertura de puerta (DS). Las rutinas que manejan los dispositivos se encuentran en las direcciones que se muestran a continuación: RTC en 000108h, CP en 000304h y DS en 000510h. El RTC y el CP poseen sendos registros de estado (RTC STATUS y CP STATUS) . Este registro puede ser escrito o leı́do desde el microcontrolador con una instrucción de E/S. Ambos dispositivos continúan solicitando interrupción hasta que se escribe la constante 0 en su registro de estado o el dispositivo desiste del pedido. a) Describir en pseudocódigo los pasos que realiza el hardware del microcontrolador para detectar la interrupción hasta que deja paso a la rutina de atención de interrupción solicitada. b) Describa detalladamente con un algoritmo (pseudocódigo) la rutina de atención de interrupciones de prioridad baja (muestre cómo detecta quién produjo la interrupción). Tener en cuenta que cuando se está atendiendo a un dispositivo de prioridad baja, las interrupciones de prioridad alta deben estar habilitadas, y que de esto se debe encargar el software. Analizar cuál es el contexto que debe ser salvado por la rutina antes de iniciar el tratamiento especı́fico de cada dispositivo. c) Cuando se termina la rutina de atención de interrupción, ¿qué operaciones necesita realizar el hardware para retornar de la interrupción en forma transparente? Ejercicio 6 El procesador central de la cabina de un avión tiene 4 dispositivos conectados: 1. Monitor de presión del aire en la cabina del piloto y de los pasajeros. 2. Monitor de altura 3. Monitor de combustible 4. Monitor GPS Cada monitor solicita una interrupción cuando se ha registrado un cambio en el entorno que está midiendo para informar sobre el nuevo estado. Los monitores están listados por prioridad, siendo 1 el de mayor prioridad y 4 el de menor. Un monitor de mayor prioridad puede interrumpir la rutina de atención de interrupciones de un monitor de menor prioridad. Cada monitor posee en alguna parte de la memoria una rutina de atención especı́fica para ese dispositivo. El acceso a los registros de los dispositivos de E/S y los controladores es mediante Registros No Mapeados en memoria (espacio de direcciones independiente de E/S), para lo cual esta arquitectura posee las instrucciones especiales: IN Reg,RegES que copia el contenido del registro de E/S a un registro del CPU 4 OUT RegES,Reg que copia el contenido del registro en el registro de E/S. El CI tiene un registro de E/S no mapeado a memoria de 16 bits en la dirección INTMASK para configurar la máscara de interrupciones. En este registro el bit 0 para el monitor 1, el bit 1 para el monitor 2, etc. Los bits 4-15 no se utilizan. Un bit en 1 indica que debe ser atendida la interrupción del monitor asociado a dicho bit. El CPU cuenta con un flag I en el registro PSW, que también incluye todos los otros flags, y con dos instrucciones para habilitar o deshabilitar interrupciones: CLI y STI. Cuando el CPU decide atender a un dispositivo que está interrumpiendo, se lo avisa al controlador de interrupciones levantando la señal INTA (interrupción reconocida). Acto seguido el controlador coloca en el bus de datos el número de dispositivo que corresponde atender de acuerdo a la máscara. Cuando se le da el control a una rutina de atención de interrupciones, todas las interrupciones se encuentran inhibidas. Cuando el monitor de altura solicita una interrupción al controlador de interrupciones: a) Describa el comportamiento de la señal INTR. b) Indique un mecanismo para ubicar las direcciones de las rutinas de atención de interrupciones. c) ¿Qué acciones se llevan a cabo por el hardware del procesador? d) Completar la siguiente rutina de atención: RAT_MONITOR_ALTURA: ; Guarda la mascara PUSH AX IN AX, INTMASK PUSH AX ; apila el registro AX ; copia el contenido del reg. de ES INTMASK en AX ; apila la máscara actual ; Setear mascara inhibiendo interrupciones de menor prioridad. MOV AX , .... (completar) OUT INTMASK, AX ;copia el contenido de AX en el reg. de ES INTMASK ; habilitar interrupciones ....(completar) ; Salvar el estado de lo que falte ....(completar) ; Obtener la altura nueva IN AX, 43h ; copia el contenido LEA SI, Altura ; Copia la constante MOV [SI], AX ; Copia el contenido ; dirección apuntada del reg. 43h de ES en AX Altura en el reg. SI del registro AX en la por el reg. SI ; Ya se actualizó la altura, completar lo que falta para terminar. e) ¿Es necesaria una instrucción especial para indicar el fin de una interrupción o alcanza con el mismo RET que se utilizar para volver de un CALL? Ejercicio 7 El MC68000 es un procesador que contiene un PC de 24 bits que direcciona a byte y un registro de estado (SR) de 16 bits el cual guarda el estado del procesador y los flags. Este procesador posee 2 modos de operación que son indicados en el bit S del registro SR: 5 Usuario (S=0): sólo se puede acceder a los primeros 8 bits del SR que contienen los flags. Supervisor (S=1): se puede acceder a todo el SR (incluyendo a la máscara de interrupciones que contiene la prioridad y el bit de modo) y a direcciones de memoria donde están mapeados los dispositivos de E/S. Los bits I2,I1,I0 del registro de estado definen la máscara de interrupciones utilizada. Máscara 111 ... 001 000 Significado máxima prioridad ... mı́nimo prioridad interrupciones deshabilitadas El CPU posee: 3 señales de entrada: IPL0, IPL1 e IPL2 para las interrupciones externas. Estas señales indican el nivel de prioridad de la interrupción solicitada. El CPU atiende una interrupción sólo si I2,I1,I0!=000 y I2,I1,I0≤IPL2,IPL1,IPL0. 1 señal de salida: IPEND, para el reconocimiento de la interrupción. Si el CPU reconoce la interrupción levanta la señal (IPEND=1). Una vez que el procesador reconoció la interrupción (IPEND=1), el dispositivo tiene 2 formas distintas de indicarle al CPU cuál es la dirección de inicio de la rutina de atención de interrupción: Si el dispositivo levanta la señal AVEC (AVEC=1), le indica al CPU que debe utilizar la dirección del vector de interrupciones 000000h, e indexar esta tabla usando el nivel de interrupción codificada en IPL2,IPL1,IPL0 Si el dispositivo baja la señal AVEC (AVEC=0), el dispositivo coloca en el bus de datos la dirección de inicio de otro vector de interrupciones. El CPU leerá esta dirección del bus de datos, y la indexará usando el ı́ndice codificado en IPL2,IPL1,IPL0. 6 a) Detalle todos los pasos que cree usted que se desencadenan en el sistema al llegar un pedido de interrupción hasta que la misma es satisfecha y se devuelve el control. Justifique la decisión del orden de los pasos y aclarando debidamente que es lo que realiza el micro código (hardware) y que es lo que realiza la rutina de atención de interrupciones (software). b) Con los pasos que detalló en 1 describa el comportamiento del 68000 si se activan las lineas IPLx de la siguiente forma IPL2=0,IPL1=0,IPL0=1, con un SR=021Ah y el dispositivo que provoca la interrupción no posee vector de interrupciones propio. Mencione a qué posición de memoria se va a buscar la dirección de inicio de la rutina de atención de interrupciones de este dispositivo. c) Realice un gráfico que muestre que interrupción se esta atendiendo, en que estado queda el SR a cada instante suponiendo que su valor inicial es SR=0011h. Utilice el número de dispositivo como su nivel de interrupción. Suponga que las rutinas no alteran los códigos de condición y aquellos bits que no se utilizan permanecen en 0. Tome en cuenta que el microprocesador puede encolar hasta 2 pedidos de interrupción y que atender la interrupción le lleva 10 unidades de tiempo. Mientras que no esta atendiendo una interrupción el 68000 corre un programa con nivel de usuario. Instante T 10 25 30 43 44 Dispositivo 1 4 6 2 3 Ejercicio 8 Algunas arquitecturas implementan una interrupción temporizada que se dispara automáticamente cada n ciclos de reloj. ¿De qué sirve interrumpir al procesador cuando ningún dispositivo requiere realmente su atención? Ejercicio 9 Indicar qué técnica de sincronización (polling o interrupciones) y qué mecanismo de transferencia de información a memoria (a través de la CPU o usando DMA) es el más apropiado para cada uno de los siguientes dispositivos. a) Disco rı́gido b) Teclado c) Calefón programable, dentro de un sistema embebido. Justificar la respuesta describiendo cómo utilizarı́a el dispositivo con el mecanismo propuesto. Ejercicio 10 1 1 Se cuenta con el siguiente sistema: Ch. 7, pag. 282, Computer Organization and Architecture, Null & Lobur. 7 A continuación se describe un posible protocolo entre el controlador de DMA y el de un dispositivo de E/S para realizar transferencias de datos usando el I/O Bus. 1. El controlador DMA pone en el bus de direcciones el identificador del dispositivo con el que desea iniciar la comunicación y levanta la señal de Request y de RD o WR, según corresponda. 2. El controlador del dispositivo detecta la señal de Request y compara su propio identificador con el contenido del bus de direcciones. 3. Si coincide el identificador y el dispositivo se encuentra listo, el controlador levanta la señal de Ready. 4. El controlador DMA detecta la señal de Ready. En el caso de tratarse de una escritura, el controlador DMA pone el dato a escribir junto con su posición de memoria en los buses correspondientes. Por otro lado, en el caso de una lectura, el controlador de DMA pone la dirección del dato deseado. 5. El controlador DMA baja la señal de Request. 6. De tratarse de una escritura, el controlador del dispositivo ordena grabar el dato, o en el caso de una lectura pone el dato en el bus. Luego, baja la señal de Ready. 7. Si se trata de una lectura el DMAC lee el dato del bus de datos. 8. En ambos casos, lectura y escritura, el DMAC retira las lı́neas y baja la señal de RD o WR según corresponda. 9. Si es una lectura, cuando el DMAC baja la señal de RD la Controladora del dispositivo quita el dato del bus de datos. Teniendo en cuenta el protocolo y el sistema presentado, escribir en pseudocódigo la rutina del controlador de la cinta, suponiendo el mismo hace polling sobre la señal de Request. Para ello, cuenta con las siguientes primitivas para manejar la cinta de backup: REW : Rebobina la cinta hasta el principio. PLAY: Lee el dato (de 16 bits) de la posición actual y lo almacena en un buffer. Luego avanza la cinta una posición. READ: Lee el buffer de datos y devuelve el contenido. Y las siguientes primitivas para manejar las lı́neas de control, el bus de datos y direcciones del I/O Bus: requestOn() : Devuelve si está levantada la lı́nea de Request. readOn(): Devuelve si el controlador DMA desea leer. writeOn(): Devuelve si el controlador DMA desea escribir. setReady(x): Setea la señal de Ready con el valor de x (x en 1 ó 0). setData(x): Escribe x en el bus de datos. getData(): Lee el bus de datos. setAddress(x): Escribe x en el bus de direcciones. getAddress(): Lee el bus de direcciones. Se considera que el primer dato de la cinta se encuentra en la posición 0 y que la cinta no tiene más de 65536 posiciones. Tener en cuenta que esta cinta es sólo de lectura. 8 Ejercicio 11 Teniendo en cuenta el protocolo y el sistema presentado en el Ejercicio 10, escribir en pseudocódigo la rutina del controlador DMA que se encarga de comunicarse con un dispositivo (controlador) y la memoria principal (tanto en el caso de lectura como de escritura). El controlador DMA posee un conjunto de registros, que ya se encuentran cargados con la siguiente información: DEVICE: identificador del dispositivo. DEVICE ADDRESS: dirección de memoria (en el espacio de direccionamiento del dispositivo) que se desea leer/escribir. MEM ADDRESS: dirección de memoria (en el espacio de direccionamiento de la memoria principal) que se desea leer/escribir. SIZE: cantidad de datos a transferir. STATUS: • el bit menos significativo contiene un 1 en caso de escritura, y un 0 en caso contrario. • si el bit mas significativo contiene 1 indica que ya se han se cargado todos los datos necesarios, y se puede iniciar la transmisión. Las primitivas para manejar las lı́neas de control, el bus de datos y direcciones del I/O bus son las siguientes: readyOn : Devuelve si está levantada la lı́nea de Ready. setReadWrite(x): Setea la señal de Read con x en 1 y Write con x en 0. setRequest(x): Setea la señal de Request con x (con x en 1 ó 0). setData(x): Escribe x en el bus de datos. getData: Lee del bus de datos. setAddress(x): Escribe x en el bus de direcciones. getAddress: Lee del bus de direcciones. Cuando el controlador de DMA desea leer un dato de memoria principal (usando el Memory Bus) utiliza la rutina readMemory(address). En el caso de una escritura a memoria, utiliza writeMemory(address, data). Ambas rutinas ya se encuentran programadas. Para solicitar una interrupción el DMAC dispone de la primitiva RequestINT(). Ejercicio 12 Manteniendo el tamaño de los buses, ¿cómo modificarı́a el protocolo del Ejercicio 10 para permitir utilizar direcciones, dentro del espacio de direccionamiento del dispositivo, de más de 16 bits? (pista: se pueden agregar lı́neas de control). Ejercicio 13 En una computadora ORGA1 se ha conectado un controlador DMA como el del Ejercicio 11. El acceso a cada uno de los registros del controlador está mapeado a memoria del siguiente modo: DEVICE DEVICE ADDRESS MEM ADDRESS SIZE STATUS 0xFFF0 0xFFF1 0xFFF2 0xFFF3 0xFFF4 Escribir un programa en assembler que acceda a una cinta para transferir datos via DMA. El identificador de la cinta es 0x354A. Se quiere transferir desde la posición 0x0045 de la cinta hasta la 0x013A. Estos datos se deben guardar a partir de la posición 0xA142 de la memoria principal. El bit menos significativo del registro STATUS contiene un 1 en caso de escritura, y un 0 en caso contrario. La forma de indicarle al controlador DMA que ya se cargaron todos los datos necesarios, y que puede iniciar la transmisión, es seteando en 1 el bit más significativo del registro STATUS. 9 Ejercicio 14 En algunas arquitecturas es posible definir zonas de memoria como excluı́das de cache (las referencias a estas direcciones siempre son resueltas en la memoria principal) ¿Por qué motivos podrı́a ser esto deseable? Ejercicio 15 Discuta brevemente: ¿Qué desventaja encuentra en un sistema con DMA pero con un CPU sin interrupciones? Ejercicio 16 Un disco tiene 128 pistas de 32 sectores cada una, sobre una superficie de 8 platos de una sola cara cada uno. El disco gira a 3600 rpm y para moverse entre dos pistas le toma 60ms en el peor caso. ¿Cuál es el tiempo más largo necesario para leer completamente un sector arbitrario, ubicado en cualquier lugar del disco? Ejercicio 17 Un disco tiene p pistas de s sectores cada una, y h cabezas. El disco gira a R rpm y para moverse entre dos pistas adyacentes le toma ta y entre pistas extremos tx (peor caso). Calcular los siguientes parámetros: a) Tt : Tiempo de latencia media (en sg) b) Ts : Tiempo de lectura de 1 sector c) Tmin : Tiempo mı́nimo para leer el disco completo d) Tmed : Tiempo medio para leer secuencialmente el disco completo e) Tmax : Tiempo máximo para leer el disco completo (no secuencialmente) Ejercicio 18 Se cuenta con un controlador de disco rı́gido que posee las siguientes primitivas: READ: lee el sector actual del disco. CURRENT CYLINDER, CURRENT HEAD, CURRENT SECTOR : devuelven, respectivamente, el cilindro, cabeza y sector actual del disco. SET CYLINDER(c): mueve el cabezal de lecto-escritura del disco hasta el cilindro c. SET HEAD(h): selecciona la cabeza h que utilizará para leer o escribir. #HEAD, #CYLINDER, #SECTOR: devuelven, respectivamente, la cantidad de cabezas, cilindros y sectores del disco. Suponer que para leer un sector especı́fico, se debe posicionar la cabeza del disco en el cilindro apropiado y esperar (mediante polling) a que el disco gire para llegar al sector buscado. El espacio de direcciones del disco comienza en la dirección cero y se corresponde con la terna <cabeza, cilindro, sector>= <0,0,0>. La última posición es la #HEAD * #CYLINDER * #SECTOR, y se corresponde con la terna <#HEAD-1, #CYLINDER-1, #SECTOR-1>. a) Considerando el protocolo del Ejercicio 10, escribir en pseudocódigo una rutina que se encargue de leer datos del disco a través de DMA. Asumir que se cuenta con las mismas primitivas para manejar lı́neas de control y buses que las del Ejercicio 10. b) En el caso que el controlador DMA solicite una dirección que no pertenezca al espacio de direccionamiento del disco, sugerir una modificación al protocolo para que el dispositivo pueda indicarle un estado de error al controlador. Modificar el pseudocódigo de acuerdo a esto. 10