Sistemas empotrados y ubicuos

Cuestiones sobre el tema programación de dispositivos

  1. Revise el ejercicio incluido en las transparencias.
  2. 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.
  3. Enumere ventajas y desventajas de MMIO frente a PIO. ¿Pueden estar ambas técnicas presentes en un mismo sistema?
  4. ¿Cómo se impide en un sistema de propósito general que un programa de usuario pueda hacer PIO? ¿Cómo puede un programa realizar PIO en un sistema Linux x86 saltándose este impedimento?
  5. ¿Cómo se impide en un sistema de propósito general que un programa de usuario pueda hacer MMIO? ¿Cómo puede realizar MMIO un programa en Linux?
  6. Explique qué pasos son necesarios, incluyendo las operaciones de configuración, para escribir un 1 en el pin X de la GPIO de la Raspberry Pi.
  7. Explique qué pasos son necesarios, incluyendo las operaciones de configuración, para leer el pin X de la GPIO de la Raspberry Pi.
  8. 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é?
  9. Explique qué ventajas y desventajas tiene que el hardware de E/S de un sistema ofrezca scatter-gather DMA.
  10. 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.
  11. 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.
  12. ¿Pueden producirse problemas de coherencia entre caché y memoria en una operación de DMA tanto usando MMIO como PIO?
  13. ¿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 no usa IOMMU? ¿Y en uno que sí dispone de IOMMU?
  14. Explique en qué consiste el direccionamiento geográfico de dispositivos y para qué se utiliza.
  15. ¿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?
  16. Considere un dispositivo conectado a PCI que requiere solo una dirección MMIO para el único registro que tiene. Indique qué labor se lleva a cabo en las siguientes fases con respecto a la gestión de los distintos tipos de direcciones:
  17. Describa qué tipo de optimizaciones puede realizar un compilador que afecten a la programación de dispositivos.
  18. Describa qué tipo de optimizaciones puede realizar un procesador que afecten a la programación de dispositivos.
  19. ¿Qué implica el calificador volatile aplicado a una variable en C?
  20. Explique el sentido de aplicar el calificador volatile a una variable en C asociada a una dirección de entrada/salida.
  21. Explique el sentido de aplicar el calificador volatile a una variable compartida entre un programa y una rutina de interrupción.
  22. 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.
  23. 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;
    
  24. ¿Qué diferencia existe entre un manejador de dispositivo diseñado para un sistema operativo monolítico y uno creado para un sistema basado en un micro-núcleo?
  25. Enumere qué tipos de operaciones exporta al resto del sistema un manejador de dispositivo en un sistema operativo monolítico con módulos cargables y que proporciona plug&play.
  26. Explique cómo se le proporciona acceso a una aplicación a los servicios ofrecidos por un determinado manejador para operar sobre un dispositivo dado en un sistema de tipo UNIX, especificando el concepto de major y minor. ¿Cómo se crea ese punto de acceso en un sistema Linux actual?
  27. Describa qué distintos tipos de necesidades de reserva de memoria puede tener un manejador en un sistema monolítico (visto de manera complementaria: qué tipo de funciones de reserva de memoria suele ofrecer el núcleo del sistema operativo a los manejadores).
  28. 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;
    
  29. Describa razonadamente qué tipo de operaciones no se pueden llevar a cabo en el contexto de ejecución de una rutina de interrupción de un sistema operativo. ¿Y en el contexto de un hilo de núcleo?
  30. Describa qué acciones se producen en un sistema Linux desde que se detecta la conexión del primer dispositivo de un cierto tipo en un bus interno con capacidad de plug&play hasta que se realiza la carga del módulo manejador para ese tipo de dispositivos.