2011-11-02 11 views

Respuesta

4

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.

5

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).

+0

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

1

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

Linux Interrupt vs. Polling

Linux user space PCI driver

How do I inform a user space application that the driver has received an interrupt in linux?

Cuestiones relacionadas