GNU/Linux >> Tutoriales Linux >  >> Linux

Ejecutar una función de espacio de usuario desde el espacio del kernel

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


Linux
  1. Cómo instalar Kernel 5.13 en Ubuntu 18.04 desde el repositorio 20.04

  2. ¿Qué pasó con el espacio libre?

  3. Controlador de dispositivo del kernel de Linux a DMA desde un dispositivo a la memoria del espacio del usuario

  4. ¿Cómo acceder (si es posible) al espacio del kernel desde el espacio del usuario?

  5. ¿Por qué la función de cierre se llama release en `struct file_operations` en el kernel de Linux?

Cómo cambiar el kernel predeterminado (arranque desde el kernel antiguo) en CentOS/RHEL 8

¿Dónde está la función itoa en Linux?

¿Cómo funciona internamente copy_from_user del kernel de Linux?

¿Por qué el núcleo se asigna al mismo espacio de direcciones que los procesos?

Compilando el kernel de Linux, ¿cuánto tamaño se necesita?

¿Qué impide que las distribuciones utilicen el último kernel de Linux?