plasma escribió:Creo entender, con mis humildes conocimientos sobre ordenadores personales, que si controlas las interrupciones del dispositivo usb, puedes "interrumpir" la comunicacion con el dispositivo hasta que te haga falta acceder a el y por lo tanto por ejemplo no estar haciendo trabajar todo el rato al disco duro... que se pone hirviendo con el uloader
.
No, hombre, no
. Si de hecho, le tuve que meter un watchdog al programa para evitar que el disco duro se eche a dormir por inactividad
, pero lo de hacer trabajar "todo el rato", es cosa del juego, no mía (el watchdog solo interviene si han pasado mas de 16 segundos desde la última vez que se produjo un acceso)
Las interrupciones son un mecanismo que tienen los periféricos de solicitar al procesador que deje de hacer lo que está haciendo y que le haga caso, por así decir.
¿Y en que nos afecta poder hacer uso de ellas?.
Pues básicamente, hasta ahora , cuando queríamos transferir datos desde el HDD a memoria, teníamos que hacer una lectura mas o menos constante de los flags que intervienen para conocer cuando había acabado la transferencia, ya fuera con éxito o por algún tipo de error y habíamos usado dos métodos:
- Método Kwiirk: consiste en que el bucle del programa se está ejecutando constantemente y solo puede ser interrumpido por un hilo de mayor prioridad. Esto significa, que si una lectura requiere 100ms, durante esos 100ms no podrán ser atendidos los hilos de menor prioridad...
- Método Hermes: consiste en un bucle de programa al que se le introduce una syscall de temporización que lo que hace es "dormir" ese hilo durante una serie de microsegundos, para evitar que los hilos de menor prioridad no puedan ejecutarse. El inconveniente es que puede haber un desfase entre el momento en que se terminó la transferencia y el momento que pasamos a tratarla (por ejemplo, algo que tarde 40us y nosotros dormimos 125us), pero también existe un inconveniente secundario: aunque durmamos el hilo, estamos constantemente interrumpiendo a los hilos cuando dormimos/despertamos. Y estamos hablando de un procesador que trabaja a 243Mhz...
- Método por interrupciones: Aquí es el propio host EHCI el que te avisa de los cambios que se producen. Eso significa que podemos dormir el hilo y hacer que el vector (mas bien el hilo asociado) lo despierte al completar la transferencia. De esta forma, conseguimos no putear tanto a los hilos que tienen una prioridad inferior a la nuestra.
El inconveniente es que esa interrupción tiene un límite de tiempo para ser respondida (se puede programar en pasos desde 125us, que sería lo conveniente desde el punto de vista de velocidad de transferencia) y que se responde desde un hilo de programa en
modo usuario, que me está creando una serie de problemas de conmutación (los tiempos de reacción son tan cortos, que hace que se puedan producir dos interrupciones y que en el propio vector cancelemos una de ellas sin querer, debido a la puñetera syscall que se encarga de volver a habilitar la mascara de interrupción...)
Seguramente, podría evitarlo subiendo el tiempo de respuesta, pero eso afectaría a la velocidad de transferencia... pero por suerte, el nuevo mload es mucho más poderoso que su predecesor
Una de las virtudes es que he habilitado el vector SWI (interrupciones por software) y ahora tenemos una especie de syscalls que nos permiten acceder desde
modo supervisor a registros y zonas de memoria restringidas. Además, cuenta con la ventaja de que puedo llamar a las syscalls de verdad desde dentro.
El nuevo mload proporciona una serie de funciones desde "svc 0xcc" y gracias a eso puedo por ejemplo, habilitar la mascara de interrupciones directamente e incluso puedo ejecutar código a salvo de otras interrupciones (al entrar en
modo supervisor mediante la función de ensamblador "svc 0xcc" automáticamente están deshabilitadas todas las interrupciones... lo que me va a permitir salvar efectos no deseados por parte de otros hilos).
Y en eso estoy trabajando ahora mismo, en dotar de servicios a esta nueva syscall que entre otras cosas, permite a otros módulos registrar su propio servicio y así por ejemplo, svc 0xab lo usa el sistema, solo que en nuestras consolas de casa, eso llevaría a un simple retorno. Pues ahora se puede utilizar este sistema para que otros posibles módulos compartan información registrando su propia función de servicios (de igual manera que puedo acceder a ciertos servicios que me presta mload)
Así que como veis, ando ocupado reforzando este tipo de detalles para luego centrarme en resolver los problemas que tiene el driver EHCI, con estas nuevas herramientas.
Lo que está claro, es que si mload antes era la caña, ahora es DIOS con éstas nuevas posibilidades