En Linux, ¿cuáles son las opciones para manejar las interrupciones de dispositivo en el código de espacio de usuario en lugar de en el espacio del kernel?Manejo de interrupción de Linux en el espacio de usuario
Respuesta
Hay , pero manejo todavía se debe hacer en el espacio del kernel. OTOH, si solo necesitas notar la interrupción, no necesitas la parte del kernel.
Puede que desee echar un vistazo a CHAPTER 10: Interrupt Handling del libro Linux Device Drivers, Third Edition.
La experiencia dice que es posible escribir controladores de espacio de usuario estables y buenos para casi cualquier adaptador PCI. Simplemente requiere un poco de sofisticación y una pequeña capa de proxying en el kernel. UIO es un paso en esa dirección, pero si desea manejar correctamente las interrupciones en el espacio de usuario, entonces UIO podría no ser suficiente, por ejemplo, si el dispositivo no es compatible con el bit de desactivación de interrupción de la especificación PCI en el que UIO confía.
Observe que las latencias de activación del proceso son algunos microsegundos, por lo que si su implementación requiere una latencia muy baja, el espacio de usuario podría ser un obstáculo.
Si tuviera que implementar un controlador de espacio de usuario, lo que reduciría el ISR del núcleo a sólo un "desactivar & ACK & despertar-userpace" operación, manejar la interrupción en el proceso despertado arriba, y luego volver a habilitar la interrupción (por supuesto, al escribir en la memoria PCI asignada desde el proceso del espacio de usuario).
Tienen que activar el código de usuario indirecto.
Kernel ISR indica interrupción escribiendo el archivo/ajuste registro/señalización. La aplicación de espacio de usuario sondea esto y continúa con el código apropiado. Casos extremos: más o menos interrupciones de lo esperado (tiempo de espera/demasiadas interrupciones por intervalo de tiempo)
La abstracción de archivos de Linux se utiliza para conectar kernel y espacio de usuario. Esto se realiza mediante dispositivos de caracteres y llamadas ioctl()
. Algunos pueden preferir entradas sysfs para este propósito.
Esto puede parecer extraño porque las notificaciones de los dispositivos activados por eventos (interrupciones) se enganchan con un sondeo "activado por tiempo", pero en realidad es un bloqueo asincrónico (lectura/selección). De todos modos, surgen algunas preguntas según el rendimiento.
Por lo tanto, las interrupciones no se pueden manejar directamente fuera del kernel. P. ej. la memoria compartida puede estar en el espacio del usuario y con algunas configuraciones de permisos de E/S pueden correlacionarse direcciones, por lo que U-I/O funciona, pero no para el manejo de interrupciones directas.
he encontrado sólo un 'informe de la minoría' en el tema vfio (http://lxr.free-electrons.com/source/Documentation/vfio.txt): https://stackoverflow.com/a/21197797/5349798
preguntas similares:
Running user thread in context of an interrupt in linux
Is it possible in linux to register a interrupt handler from any user-space program?
Linux Kernel: invoke call back function in user space from kernel space
How do I inform a user space application that the driver has received an interrupt in linux?
- 1. Manejo de señales en C - Interrupción de interrupción
- 2. Manejo de excepciones en linux
- 3. manejo de interrupciones (Linux/General)
- 4. ¿Barreras de memoria en el espacio de usuario? (Linux, x86-64)
- 5. Manejo de confirmaciones de entrada en scripts de shell Linux
- 6. Pobre rendimiento memcpy en el espacio de usuario para memoria física mmap'ed en Linux
- 7. ¿Cómo acceder a la memoria de espacio de usuario desde el kernel de Linux?
- 8. Erlang Manejo de señal de Linux
- 9. Linux controlador de dispositivo del núcleo de DMA desde un dispositivo de memoria en el espacio de usuario
- 10. Cómo probar si una dirección es legible en la aplicación de espacio de usuario de linux
- 11. Implementando syscalls cancelables en el espacio de usuario
- 12. Problema con el manejo de señales, manejo de interrupciones
- 13. Limpiar el manejo del espacio de nombres con dom4j
- 14. ¿Puedo evitar que un espacio de usuario de Linux genere pthread en código crítico?
- 15. ¿Cómo encontrar la dirección física de una variable del espacio de usuario en Linux?
- 16. Netlink espacio de usuario y comunicación kernel-espacio
- 17. ¿Es posible asignar, en el espacio de usuario, un bloque de memoria no almacenable en caché en Linux?
- 18. en kernel y espacio de usuario
- 19. Del kernel al espacio de usuario (DMA)
- 20. Manejo de excepciones en C sin C++ en Linux
- 21. Establecer el punto de interrupción en el código C o C++ programáticamente para gdb en Linux
- 22. C++ agregar usuario de Linux
- 23. Punto de interrupción del usuario de ninguna parte
- 24. cómo encontrar el uso de espacio de disco por usuario?
- 25. Asignación de búferes DMA al espacio de usuario
- 26. ¿Cómo controlar el espacio disponible del búfer UDP de Linux?
- 27. ¿Cuál es la mejor manera de leer desde las interfaces Linux/proc utilizando el código de espacio de usuario C?
- 28. Obtener el usuario de apache linux de php
- 29. ¿Se pueden utilizar macros probables/improbables en el código de espacio de usuario?
- 30. FormsAuthentication - manejo de un cambio de nombre de usuario
Cuando hacemos controlador de espacio de usuario, ¿Tiene sentido para borrar interrupción en el kernel o en el espacio de usuario? Creo que debe estar claro cuando se realiza el manejo (por lo que en el espacio de usuario), ¿verdad? – ransh