¿Es posible llamar a una función de devolución de llamada del espacio de usuario desde el espacio del núcleo de Linux (ioctl)?

StackOverflow https://stackoverflow.com/questions/2689975

Pregunta

¿Es posible ampliar la interfaz ioctl en Linux para que la aplicación del espacio de usuario puede enviar un puntero a una función al controlador espacio del núcleo?

Estoy pensando en particular, de las formas de manejar el flujo de manera controlable por el usuario, pero hacerlo en el núcleo. Esas operaciones se podrían unir al módulo del kernel, pero esto haría que el desarrollo sea mucho más fácil, ya que no tendría que meterse con el núcleo durante el desarrollo.

Más específicamente, este sería el proceso:

  1. Los datos se leen por el conductor de un búfer.
  2. Datos es manejado por estas funciones definidas por el usuario en su lugar.
  3. Un poco más de la manipulación se hace, posiblemente con algunos bloques de HW.
  4. Datos es utilizado por una aplicación de espacio de usuario.
¿Fue útil?

Solución

Creo que se puede lograr lo que quiere por tener el controlador de proporcionar uno o más dispositivos de carácter (o dispositivos de bloque) que sus aplicaciones espaciales usuario abre.

A continuación, se puede utilizar inotify ( Linux journal artículo ) para kernel> comunicación de eventos espacio de usuario. Ioctl o escribir en el dispositivo para el usuario espacio-> kernel de comunicación de eventos. El intercambio de datos también podría lograrse mediante la lectura / escritura a uno o más ficheros de dispositivo.

Como alternativa puede proporcionarle / proc o / sys sistema de ficheros entradas o el uso de enlace de red.

También podría considerar ksocket :

  

Ksocket es un módulo del kernel de Linux 2.6   que proporciona socket de estilo bsd   interfaces (es decir, socket, bind,   escuchar, conectar, aceptar, ...) para   kernel desarrolladores para facilitar su   progaramming red en Linux kernel   espacio.       Las interfaces ksocket regalos son lo mismo que sus equivalentes   en glibc, por lo que incluso para los nuevos desarrolladores   el espacio del núcleo tendrá ninguna barrera en   el desarrollo de la red relacionados con el núcleo   Programms.

Otros consejos

creo que está pidiendo un círculo cuadrado: si el núcleo tuviera que acaba de ejecutar su función de "espacio de usuario" directamente, no sería "espacio de usuario", sino más bien un sistema de módulo de carga de homebrew. Asumo que lo que realmente queremos es una forma de averiguar qué hacer para hacer que todo funcione sin chocar su PC cada vez que se comete un error. Tal vez usted podría abusar de los gestores de señales como el medio de "devolución de llamada", pero estoy demasiado oxidada señalar cómo se obtendría Atrás para el núcleo, como si de un retorno de llamada a la función. El problema aquí es que en cualquier userland- cambio de contexto> del núcleo, el núcleo comienza con una pila fresca, por lo que la dirección de retorno se han ido. ¿Qué tal si se combina con un manejador de señales mmap'ing / dev / mem, y deja que tu espacio de usuario pseudodriver meter las estructuras de datos del controlador en modo kernel directamente? Pero luego de que hayas vuelto a reiniciar cuando se comete un error, a menos que encontrar la manera de MMAP sólo estructuras de datos de conducir? Otros mecanismos podrían ser repurposeable arroyos y disciplinas de líneas TTY; Creo que estos confieren una especie de transmogrifying capacidad. Por supuesto, nada de esto es una idea buena como una solución permanente!

Su caso de uso continúa mencionando datos.

Tal vez lo que quiere hacer es memoria compartida entre el núcleo y un proceso de usuario. Se puede poner los datos y / o comandos en la memoria compartida, y el código de procedimiento / kernel en el otro lado podría leerlo y hacer lo que sea. El get_user_pages_fast () llamada puede hacer que la memoria de un proceso de acceso al núcleo, incluso cuando el proceso no se está ejecutando actualmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top