Sistemas empotrados y ubicuos

Cuestiones sobre el tema programación de dispositivos

  1. Explique por qué es más frecuente la necesidad de programar dispositivos en el ámbito de los sistemas empotrados que en otros contextos y qué tipos de dispositivos son los que habitualmente se requiere programar: dispositivos de red, de almacenamiento o, tal como se denominan en UNIX, de caracteres.
  2. Enumere ventajas y desventajas de MMIO frente a PIO. ¿Pueden estar ambas técnicas presentes en un mismo sistema?
  3. Explique qué ventajas y desventajas tiene que el hardware de E/S de un sistema ofrezca scatter-gather DMA.
  4. Enumere qué ventajas y desventajas tiene que el hardware de E/S de un sistema ofrezca IOMMU.
  5. Describa los posibles problemas de coherencia entre caché y memoria en una operación de lectura de un dispositivo por DMA y explique cómo solucionarlos por software si el hardware no los resuelve.
  6. Describa los posibles problemas de coherencia entre caché y memoria en una operación de escritura de un dispositivo por DMA y explique cómo solucionarlos por software si el hardware no los resuelve.
  7. ¿Pueden producirse problemas de coherencia entre caché y memoria en una operación de DMA tanto usando MMIO como PIO?
  8. ¿Qué tipo de dirección (lógica, física o de bus) se especifica en el registro de direcciones de DMA (donde se especifica la dirección de memoria inicial del buffer a leer o escribir) de un dispositivo en un sistema que utiliza MMU pero no usa IOMMU? ¿Y en uno que sí dispone de IOMMU?
  9. Explique en qué consiste el direccionamiento geográfico de dispositivos y para qué se utiliza.
  10. ¿Qué tipo de información se obtiene al descubrir un dispositivo en un bus interno como PCI y qué tipo de información se escribe en el mismo para realizar su configuración?
  11. ¿Cómo se impide en un sistema de propósito general que un programa de usuario no pueda hacer PIO? ¿Y MMIO?
  12. Describa qué tipo de optimizaciones puede realizar un compilador que afecten a la programación de dispositivos.
  13. Describa qué tipo de optimizaciones puede realizar un procesador que afecten a la programación de dispositivos.
  14. ¿Qué implica el calificador volatile aplicado a una variable en C?
  15. Explique el sentido de aplicar el calificador volatile a una variable en C asociada a una dirección de entrada/salida.
  16. Explique el sentido de aplicar el calificador volatile a una variable compartida entre un programa y una rutina de interrupción.
  17. Dada la secuencia de instrucciones que se incluye a continuación correspondiente a la programación en C de una operación de lectura de un hipotético disco (uno de tipo CHS, que requiere especificar el cilindro, la cabeza y el sector implicados) usando MMIO, explique qué tipo de problemas de sincronización pueden presentarse durante la ejecución de la misma, a qué son debidos y cómo pueden solucionarse, reflejando en el seudo-codigo dicha solución.
    Programación de la lectura de un sector del cilindro 7, cabeza 2 y sector 16, en la dirección física de memoria 10000 (se supone que la variable d es de un tipo que refleja la disposición en memoria de los distintos registros del dispositivo):
    d->cilindro = 7;
    d->cabeza = 2;
    d->sector = 16;
    d->dir=10000;
    d->nsect=1;
    d->tipo = OP_LECTURA;
    d->control = INICIO_OPER;
    
  18. Explique cómo puede afectar la memoria caché a la programación de un registro de un dispositivo usando MMIO y de qué manera utilizando PIO, especificando cómo se resuelven los problemas que pueden aparecer.
  19. A la hora de repartir el trabajo de una aplicación que gestiona dispositivos entre la labor que realizan las rutinas de interrupción y el resto del código, ¿sería mejor intentar maximizar o minimizar el trabajo realizado por las interrupciones? ¿Por qué?
  20. Explique por qué motivo no se puede usar directamente la dirección de memoria del registro de un dispositivo (véase el ejemplo que aparece a continuación) cuando se programa un manejador en una máquina con MMU y un sistema operativo de propósito general y cómo se resuelve este problema.
    Ejemplo de fragmento válido para programar sobre máquina desnuda pero no con S.O. de propósito general:
    	unsigned int volatile *p = (unsigned int volatile *) 0X88888888;
    	*p = 1;
    
  21. Considere el manejador de un tipo de dispositivo plug&play en un sistema Linux. El firmware del sistema ha detectado y configurado este dispositivo en el arranque del equipo asignando a sus registros direcciones físicas a partir de la X y como línea de interrupción la I. Se trata de un dispositivo que usa DMA y dispone de cuatro registros MMIO: registro de dirección (dirección física de memoria del buffer a leer o escribir), registro de tamaño (tamaño de la transferencia), registro de control (si se escribe un 0 en este registro se inicia una operación de lectura por DMA, mientras que si se escribe un 1 se arranca una escritura), registro de estado (permite detectar cómo ha terminado la operación). A continuación, se analizan algunas de las acciones que se deben llevar a cabo en las distintas funciones del manejador.

    Solución