Entrada-Salida Entrada-Salida DMA y Discos Organización del Computador I David Alejandro González Márquez Departamento de Computación Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires 02.03.2011 Entrada-Salida Entrada-Salida ¿Qué es DMA (Direct memory access )? Es un dispositivo o caracterı́stica de un dispositivo, por la que se le permite acceder a la memoria principal independientemente del procesador central En general cuenta con registros que indican qué direcciones deben ser escritas o leı́das desde la memoria principal al dispositivo o viceversa Ver: DMA controller 8257 http://www.8085projects.info/ PROGRAMMABLE-DMA-CONTROLLER-INTEL8257.html Entrada-Salida Discos Pista/ Cilindro Los discos se componen por platos divididos en pistas y sectores. Dos consideraciones importantes, Sector La interfaz del disco, IDE, SCSI, SATA, SAS, . . . Cabezas El sistema de archivos, FAT, ext2 . . . ext4, NTFS, HFS, ISO 9660, . . . 8 cabezas, 4 platos Hard Drive Size Limitations and Barriers Ver: http://www.dewassoc.com/kbase/hard drives/hard drive size barriers.htm Entrada-Salida Entrada-Salida Ejercicios Ejercicio 1 Se posee el siguiente sistema: Memoria Disk 1 Disk 2 Controladora de discos Disk 3 El controlador puede acceder a los discos; leer o escribir sus sectores. Para esto posee un buffer interno donde se almacena temporariamente esta información. La CPU puede solicitar al controlador que lea o escriba a la memoria un sector de un disco mediante un protocolo de DMA. Entrada-Salida Ejercicios Ejercicio 1 Algunas primitivas del controlador de disco son: LeerDeDisco( Sector S, Disco D, Buffer B ) Lee el sector S del disco número D y lo almacena en el buffer interno número B. LeerDeMemoria( Dirección D, Buffer B ) Lee desde la dirección de memoria D un sector completo y lo almacena en el buffer interno número B. a. Identificar todos los registros que requiera el controlador indicando su uso. b. Identificar qué primitivas faltan definir para la controladora. c. Escribir el seudocódigo de la controladora de discos. d. Programar el controlador para copiar el sector número 387 del disco 2, a la dirección de memoria 0x3041. Entrada-Salida Ejercicios Ejercicio 1: Solución a. Identificar todos los registros que requiera el controlador indicando su uso. DISCO: Selecciona el disco con el cual se desea interactuar. SECTOR: Indica que sector del disco que se desea leer o escribir. DIRECCION: Indica la dirección de memoria para leer o escribir. ESTADO: Proporciona el estado del dispositivo 0x86 : Ocupado Leyendo 0x82 : Ocupado Escribiendo 0x00 : Libre Entrada-Salida Ejercicios Ejercicio 1: Solución b. Identificar qué primitivas faltan definir para la controladora. Faltan definir todas las primitivas de escritura en disco y en memoria EscribirEnDisco( Sector S, Disco D, Buffer B ) Escribir el buffer interno número B en el sector S del disco número D. EscribirEnMemoria( Dirección D, Buffer B ) Escribir el buffer interno número B desde la dirección de memoria D. Entrada-Salida Ejercicios Ejercicio 1: Solución c. Escribir el seudocódigo de la controladora de discos. while(true) if( ESTADO == 0x86 ) LeerDeDisco(SECTOR,DISCO,BUFFER_DMA_LECTURA) EscribirEnMemoria(DIRECCCION,BUFFER_DMA_LECTURA) ESTADO <- 0x00 if( ESTADO == 0x82 ) LeerDeMemoria(DIRECCCION,BUFFER_DMA_ESCRITURA) EscribirEnDisco(SECTOR,DISCO,BUFFER_DMA_ESCRITURA) ESTADO <- 0x00 Donde BUFFER DMA LECTURA y BUFFER DMA ESCRITURA son buffers de la controladora reservados para el DMA. Entrada-Salida Ejercicios Ejercicio 1: Solución d. Programar el controlador para copiar el sector número 387 del disco 2, a la dirección de memoria 0x3041. esperar: cmp [ESTADO], 0 jz esperar mov [DISCO], 2 mov [SECTOR], 387 mov [DIRECCION], 0x3041 mov [ESTADO], 0x86 Entrada-Salida Ejercicios Entrada-Salida Ejercicios Ejercicio 2 Interrupción Capturadora de Video CPU Memoria Puente Controlador de DMA M/IO RW RD Request Ready Bus de Direcciones Bus de Datos A continuación se describe el protocolo entre el controlador de DMA y un dispositivo de E/S para realizar transferencias de datos usando el I/O Bus. Entrada-Salida Ejercicios Ejercicio 2 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, de RD o WR, según corresponda y baja la lı́nea de M/IO. 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 del dispositivo 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. · · · Entrada-Salida Ejercicios Ejercicio 2 5. · · · 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. El protocolo para interactuar con la memoria es equivalente. Cambia el valor de la lı́nea M/IO y no se coloca en el bus el identificador del dispositivo. Entrada-Salida Ejercicios Ejercicio 2 Primitivas de control del bus: requestBus() : Solicita el bus para realizar cualquier transferencia. releaseBus() : Libera el bus una vez que se termino de utilizar. Además cada lı́nea de control posee una primitiva get seguida del nombre y otra de nombre set. Que permiten leer o escribir cada una de las lı́neas respectivamente. setRequest(x) getRequest() setReady(x) getReady() setRead(x) getRead() setWrite(x) getWrite() setMemoryIO(x) getMemoryIO() Para las lı́neas de datos y direcciones se poseen primitivas que permiten leer y escribir las lı́neas en su conjunto. setData(x) getData() setAddress(x) getAddress() Entrada-Salida Ejercicios Ejercicio 2 La Placa Capturadora de Video tienen su espacio de direcciones mapeado a memoria en las direcciones FE00 a FF00. Por simplicidad suponemos que es una pantalla de video. El identificador de este dispositivo es 0x005F. A su vez, el controlador de DMA posee los siguientes registros también mapeados a memoria en las direcciones indicadas: DEVICE (0xFFA0): identificador del dispositivo. DEVICE ADDRESS (0xFFA1): dirección de memoria (en el espacio de direccionamiento del dispositivo) que se desea leer/escribir. MEM ADDRESS (0xFFA2): dirección de memoria (en el espacio de direccionamiento de la memoria principal) que se desea leer/escribir. SIZE (0xFFA3): cantidad de datos a transferir. STATUS (0xFFA4): si bit 0 contiene 1 indica que ya se han cargado todos los datos necesarios, y se puede iniciar la transmisión. el bit 1 contiene un 1 en caso de escritura, y un 0 en caso contrario. Entrada-Salida Ejercicios Ejercicio 2 El comportamiento del controlador de DMA es el siguiente, cuando el bit 0 de STATUS contiene un 1 significa que se puede comenzar la transferencia. Si el bit 1 de STATUS es un 1 entonces será de IO a Memoria, si es 0 sera de Memoria a IO. Serán transferidos la cantidad de palabras que indique SIZE, de la dirección indicada por MEM ADDRESS a DEVICE ADDRESS o viceversa. Entrada-Salida Ejercicios Ejercicio 2 1 Escribir el seudo-código que realiza el controlador de DMA 2 Suponga que existe un proceso que muestra en la pantalla los cuadros de video capturados por la placa. Este proceso posee una rutina que escribe en la memoria principal el cuadro capturado. La placa capturadora genera una interrupción, cada vez que se captura un cuadro. Realizar el seudo-código de la rutina que atiende la interrupción de la placa. (el rango de memoria AB00 a AC00 esta reservado para guardar la pantalla capturada en memoria principal) 3 Realizar el punto anterior utilizando el controlador de DMA. Entrada-Salida Ejercicios Ejercicio 2: Solución - 1 while(true) if( STATUS AND [0...01] =/= 0 ) if( STATUS AND [0...010] =/= 0 ) // IO a Memoria while( SIZE > 0 ) tempDato <- LeerDatoDeDispositivo() EscribirDatoEnMemoria(tempDato) MEM_ADDRESS <- MEM_ADDRESS + 1 DEVICE_ADDRESS <- DEVICE_ADDRESS + 1 SIZE <- SIZE - 1 STATUS <- STATUS AND [1...10] else // Memoria a IO while( SIZE > 0 ) { tempDato <- LeerDatoDeMemoria() EscribirDatoEnDispositivo(tempDato) MEM_ADDRESS <- MEM_ADDRESS + 1 DEVICE_ADDRESS <- DEVICE_ADDRESS + 1 SIZE <- SIZE - 1 STATUS <- STATUS AND [1...10] Entrada-Salida Ejercicios Ejercicio 2: Solución - 1 Lectura de Dispositivo Lectura de Memoria requestBus() setMemoryIO(0) setRead(1) setWrite(0) setAddress(DEVICE) setRequest(1) wait( getReady() =/= 0 ) setAddress(DEVICE ADDRESS) setRequest(0) wait( getReady() =/= 1 ) tempDato <- getData() setRead(0) releaseBus() requestBus() setMemoryIO(1) setRead(1) setWrite(0) setRequest(1) wait( getReady() =/= 0 ) setAddress(MEM ADDRESS) setRequest(0) wait( getReady() =/= 1 ) tempDato <- getData() setRead(0) releaseBus() Entrada-Salida Ejercicios Ejercicio 2: Solución - 1 Escritura en Dispositivo Escritura en Memoria requestBus() setMemoryIO(0) setRead(0) setWrite(1) setAddress(DEVICE) setRequest(1) wait( getReady() =/= 0 ) setAddress(DEVICE ADDRESS) setData(tempDato) setRequest(0) wait( getReady() =/= 1 ) setWrite(0) releaseBus() requestBus() setMemoryIO(1) setRead(0) setWrite(1) setRequest(1) wait( getReady() =/= 0 ) setAddress(MEM ADDRESS) setData(tempDato) setRequest(0) wait( getReady() =/= 1 ) setWrite(0) releaseBus() Entrada-Salida Ejercicios Ejercicio 2: Solución - 2 rutina: ciclo: fin: ..... ..... MOV R1, 0xAB00 MOV R2, 0xFE00 MOV R0, 0x0100 MOV [R1], [R2] SUB R0, 1 ADD R1, 1 ADD R2, 1 CMP R0, 0 JE fin JMP ciclo ..... ..... RETI Entrada-Salida Ejercicios Ejercicio 2: Solución - 3 rutina: ..... ..... MOV [DEVICE], 0x005F MOV [DEVICE_ADDRESS], 0x0000 MOV [MEM_ADDRESS], 0xAB00 MOV [SIZE], 0x0100 OR [STATUS], 0x8000 ..... ..... RETI Entrada-Salida Ejercicios Entrada-Salida Ejercicios Ejercicio 3 A continuación se presentan algunos parámetros caracterı́sticos de un disco rı́gido. Cantidad de Bytes por Sector : |Sectorbytes | Bytes Cantidad de Platos o Cantidad de Cabezas : |Cabezas| Cantidad de Pistas por Plato o Cantidad de Cilindros : |Cilindros| Cantidad de Sectores por Pista : |Sectorespista | Tiempo entre Pistas adyacentes : |Tadyasentes | Seg Tiempo promedio entre Pistas : |Tpromedio | Seg Latencia : |Tlatencia | Seg Capacidad del Buffer : |Buffer | Mb Velocidad de Rotación : |Discorotacion | RPM Velocidad de Transferencia de la Interfaz : |Interfazvelocidad | Mb/Seg Entrada-Salida Ejercicios Ejercicio 3 Calcular los siguientes valores caracterı́sticos a partir de los parámetros presentados. 1 Cantidad de Sectores totales. 2 Capacidad máxima en Mbytes. 3 Tiempo de lectura de un sector. 4 Tiempo de transferencia de un sector. 5 Tiempo de transferencia de n sectores consecutivos sobre una misma pista. Entrada-Salida Ejercicios Ejercicio 3: Solución 1 |Sectorestotales | = |Cabezas| ∗ |Cilindros| ∗ |Sectorespista | 2 |Capacidadtotal | = |Sectorestotales | ∗ |Sectorbytes | 3 |TLectura.Sector | = 60/(|Discorotacion | ∗ |Sectorespista |) 4 |TTransferencia.Sector | = |TLectura.Sector | + |Sectorbytes |/(220 ∗ |Interfazvelocidad |) 5 |TTransferencia.Sectores.Unica.Pista (n)| = n ∗ |TTransferencia.Sector | + (n − 1)|Tlatencia | Entrada-Salida Ejercicios ¿Preguntas? Entrada-Salida Ejercicios ¿Preguntas?