linux linux-kernel interrupt-handling

Manejo de interrupciones de Linux en el espacio de usuario



linux-kernel interrupt-handling (4)

En Linux, ¿cuáles son las opciones para manejar las interrupciones de dispositivos en el código de espacio del usuario en lugar de en el espacio del kernel?



Hay UIO , pero el manejo todavía debe hacerse en kernelspace. OTOH, si solo necesita notar la interrupción, no necesita la parte del kernel.


La experiencia dice que es posible escribir controladores de espacio de usuario buenos y estables para casi cualquier adaptador PCI. Solo requiere un poco de sofisticación y una pequeña capa proxy 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 admite el bit de desactivación de interrupción de la especificación de PCI en el que se basa UIO.

Tenga en cuenta que las latencias de activación del proceso son unos pocos microsegundos, por lo que si su implementación requiere una latencia muy baja, entonces el espacio de usuario puede ser un obstáculo.

Si tuviera que implementar un controlador de espacio de usuario, reduciría el ISR del kernel a solo una operación de "deshabilitar y activar y activar el espacio de usuario", manejar la interrupción dentro del proceso de reactivación y luego volver a habilitar la interrupción (de Por supuesto, escribiendo en la memoria PCI asignada desde el proceso del espacio de usuario).


Tiene que activar indirectamente el código de usuario.

El ISR del kernel indica interrupción al escribir el archivo / configuración registro / señalización. La aplicación de espacio de usuario sondea esto y continúa con el código apropiado. Casos perimetrales: 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 el kernel y el espacio de usuario. Esto se realiza mediante dispositivos de caracteres y llamadas ioctl() . Algunos pueden preferir entradas de sysfs para este propósito.

Esto puede parecer extraño porque las notificaciones (interrupciones) de los dispositivos activados por eventos se enganchan con el sondeo ''desencadenado por tiempo'', pero en realidad es un bloqueo asíncrono (lectura / selección). De todos modos algunas preguntas van surgiendo según el rendimiento.

Por lo tanto, las interrupciones no se pueden manejar directamente fuera del kernel. Por ejemplo, la memoria compartida puede estar en el espacio del usuario y con algunas direcciones de configuración de permisos de E / S se pueden asignar, por lo que la UI / O funciona, pero no para el manejo directo de interrupciones.

He encontrado un solo ''informe minoritario'' en el tema vfio ( http://lxr.free-electrons.com/source/Documentation/vfio.txt ): https://.com/a/21197797/5349798

Preguntas similares:

Ejecutando hilo de usuario en el contexto de una interrupción en linux

¿Es posible en Linux registrar un controlador de interrupciones desde cualquier programa de espacio de usuario?

Kernel de Linux: invoca la función de devolución de llamada en el espacio del usuario desde el espacio del kernel

Linux Interrupt vs. Polling

Controlador PCI del espacio de usuario de Linux

¿Cómo informo a una aplicación de espacio de usuario que el controlador ha recibido una interrupción en Linux?