Ejecutar una función de espacio de usuario desde el espacio del núcleo

5 minutos de lectura

Estoy escribiendo un controlador de dispositivo personalizado en Linux que debe poder responder muy rápidamente a las interrupciones. El código para manejar esto ya existe en una implementación de espacio de usuario, pero es demasiado lento ya que depende de que el software verifique constantemente el estado de la línea de interrupción. Después de investigar un poco, descubrí que puede registrar estas líneas de interrupción desde un módulo del kernel y ejecutar una función dada por un puntero de función. Sin embargo, el código que queremos ejecutar está en el espacio del usuario, ¿hay alguna forma de llamar a una función en el espacio del usuario desde un módulo de espacio del kernel?

Ejecutar una funcion de espacio de usuario desde el espacio
Shinnok

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 <-> User-space IPC e interfacesel sistema de archivos o la API de ayuda en modo usuario (lea a continuación).

Sin embargo, puede invocar aplicaciones de espacio de usuario desde el kernel, eso usando el API auxiliar 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

  • La invocación de aplicaciones de espacio de usuario desde el kernel no es una práctica recomendada para el manejo de interrupciones. Está destinado a ser utilizado sólo en casos muy excepcionales.

    – Kauppi

    9 de marzo de 2011 a las 15:40

  • @kauppi: tiene razón, ya experimenté un par de escenarios de pesadilla que pasaron por mis ojos en el momento en que leí su comentario … tal vez la única solución para las operaciones es transferir ese código de espacio de usuario al código del kernel o integrar el kernel apropiado <- >user-space ipc/interface para lograr la comunicación entre el espacio del usuario y el espacio del kernel si el primero no es posible.

    – Shinnok

    9 de marzo de 2011 a las 15:44


  • Invocar el código de espacio de usuario desde el núcleo suena como el último vector de ataque para el malware.

    – Bo Person

    9 de marzo de 2011 a las 17:18

  • ¿Estás seguro de que el modo Kernel no tiene acceso al espacio de memoria del modo usuario? Creo que no hay restricciones para el modo kernel, puede acceder a todo.

    – Un chico nuevo en la ciudad

    25 de agosto de 2016 a las 1:33

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 solo byte nulo.

El programa de espacio de usuario solo necesitaría ejecutar una llamada de bloqueo de lectura (), y se bloquearía de manera adecuada, hasta que lo despierte.

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

Si la activación perimetral a través de sysfs no es lo suficientemente buena, entonces la forma correcta 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.).

También estoy enfrentando el mismo problema, leí este documento http://people.ee.ethz.ch/~arkeller/linux/multi/kernel_user_space_howto-6.html, por lo que planea usar señales. En mi caso no hay posibilidad de perder señales, porque
1. El sistema es de bucle cerrado, después de que se ejecuten las señales, solo obtendré otra señal.
2. Y estoy usando señales POSIX en tiempo real.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad