c - qué - sistema operativo linux
¿Cómo el kernel de Linux interrumpe la aplicación? (3)
En primer lugar, soy un tipo de controlador de dispositivo. Esta es la primera vez que manejo un programa de modo de usuario. Solía tener una rutina de servicio de interrupción para responder a una interrupción de hardware. En otras palabras, el hardware usa la rutina de interrupción del servicio para notificar al conductor sobre el servicio. Uso ioctl para ser un canal para comunicarme entre la aplicación y el controlador del dispositivo ahora y sondear para esperar la respuesta. ¿Hay otras maneras en que un controlador de dispositivo puede notificar a una aplicación cuando finaliza alguna tarea? Cualquier comentario es bienvenido Gracias,
Hay muchas interfaces de comunicación kernel-userspace además de ioctl (señales, sockets, etc.). Consulte el espacio del núcleo: tutorial de interfaces espaciales de usuario para obtener una explicación detallada.
Normalmente, el kernel nunca notifica una aplicación a menos que la aplicación solicite la notificación y esté esperando la notificación. En los sistemas Unix, esto normalmente se hará usando las rutinas seleccionadas o similares. Uno suministra selección con un conjunto de descriptores de archivos y seleccione luego esperará hasta que haya actividad en uno de los descriptores de archivos en el momento en que regrese.
Dado que en Unix todos los dispositivos son archivos, debe poder utilizar este mecanismo para reactivar una aplicación cuando aparece una interrupción en algún dispositivo de hardware.
Hay varios mecanismos para esto. Primera aproximación: la aplicación de espacio de usuario realiza una llamada al sistema poll () o select () , esperando algún evento del kernel. El segundo enfoque es usar conectores Netlink . También hay otros como mmap()
o señales. Google by kernel user-space IPC
y verá la lista completa.
En cuanto a su caso (desarrollo de controladores), yo diría que vaya con el próximo enfoque. Cree el archivo sysfs en su controlador y haga sysfs_notify () (y quizás wait_for_completion_interruptible_timeout()
o algo así). En el espacio de usuario, seleccione () la llamada al sistema para su archivo sysfs del controlador. Vea cómo la disciplina de línea instalada desde el espacio de usuario, por ejemplo.