No tiene suerte con la invocación de funciones de espacio de usuario desde el núcleo, ya que el núcleo no sabe y no se supone que sepa acerca de las funciones y la lógica de la aplicación de espacio de usuario individual, sin mencionar que cada aplicación de espacio de usuario tiene su propia memoria. diseño, que ningún otro proceso ni el kernel pueden invadir de esa manera (los objetos compartidos son la excepción aquí, pero aún así no puede acceder a eso desde el espacio del kernel). ¿Qué pasa con el modelo de seguridad? Se supone que no debe ejecutar el código de espacio de usuario (que automáticamente se considera código inseguro en el contexto del kernel) en el contexto del kernel en primer lugar, ya que eso romperá el modelo de seguridad de un kernel allí mismo. ese instante Ahora, teniendo en cuenta todo lo mencionado anteriormente, además de muchos otros motivos, es posible que desee reconsiderar su enfoque y centrarse en Kernel <-> IPC e interfaces de espacio de usuario, el sistema de archivos o la API auxiliar de modo de usuario (lea a continuación).
Sin embargo, puede invocar aplicaciones de espacio de usuario desde el kernel, utilizando la API de ayuda de modo de usuario. El siguiente artículo de IBM DeveloperWorks debería ayudarlo a comenzar a usar la API del kernel de Linux auxiliar en modo de usuario:
API de kernel, parte 1:invocación de aplicaciones de espacio de usuario desde el kernel
Creo que la forma más fácil es registrar un dispositivo de caracteres que esté listo cuando el dispositivo tenga algunos datos.
Cualquier proceso que intente leer desde este dispositivo, luego se pone en suspensión hasta que el dispositivo está listo, luego se activa, momento en el que puede hacer lo apropiado.
Si solo desea indicar que está listo, un lector podría leer un único byte nulo.
El programa de espacio de usuario solo necesitaría ejecutar una llamada de bloqueo read(), y se bloquearía de manera adecuada, hasta que lo despiertes.
Deberá comprender el mecanismo de cola de espera del programador del kernel para usar esto.
¿Parece que su línea de interrupción ya está disponible para el espacio de usuario a través de gpiolib? (/sys/clase/gpio/...)
¿Ha evaluado si la activación de gpio edge y la encuesta () son lo suficientemente rápidas para usted? De esa manera, no tiene que sondear el estado desde la aplicación del espacio de usuario, pero la activación de borde lo informará a través de la encuesta (). Consulte Documentación/gpio.txt en el código fuente del núcleo.
Si la activación perimetral a través de sysfs no es lo suficientemente buena, entonces la forma adecuada es desarrollar un controlador de kernel que se ocupe de la parte crítica del tiempo y exporte los resultados al espacio de usuario a través de una API (sysfs, nodo de dispositivo, etc.).