2010-07-20 12 views
6

Soy un recién llegado a la programación de Linux Kernel Module. A partir del material que he leído hasta ahora, he encontrado que hay 3 formas para que un programa de usuario para solicitar servicios o para comunicarse con un¿Qué opciones tenemos para la comunicación entre un programa de usuario y un Módulo Kernel de Linux?

  1. un archivo de dispositivo Linux Kernel módulo en/dev
  2. un archivo en el sistema de archivos proc/
  3. llamada ioctl()

pregunta: ¿Qué otras opciones tenemos para la comunicación entre el programa de usuario y el módulo kernel de Linux?

Respuesta

6

su opción 3) es en realidad una sub-opción de la opción 1) - ioctl() es una forma de interactuar con un archivo de dispositivo (read() y write() siendo las formas habituales). otros

Dos maneras vale la pena considerar son:

  • El sysfs sistema de archivos;
  • Conexiones de red.
+0

Los conectores Netlink parecen prometedores pero no han podido encontrar un ejemplo funcional que use los sockets netlink. Me las arreglé para escribir las mías, pero aún tengo muchas preguntas sin respuesta. – binW

6

Básicamente, muchos mecanismos de IPC estándar - cf. http://en.wikipedia.org/wiki/Inter-process_communication - se puede utilizar:

  1. de archivo y archivo asignado en memoria: un archivo de dispositivo (como antes) o un archivo de manera similar especiales en/dev, procfs, SYSFS, debugfs, o un sistema de archivos de su cuenta, producto cartesiano con lectura/escritura, ioctl, mmap

  2. Posiblemente señales (para uso con un kthread)

  3. sockets: utilizando un protocolo de elección: TCP, UDP (cf . knfsd, pero probablemente no demasiado fácil), PF_LOCAL o Netlink (muchos subinterfaces - netlink base, genetlink, conector, ...)

Además,

4. Las llamadas al sistema (no realmente utilizable desde módulos)

5. Interfaces de red (similar a tun).

ejemplos de Netlink de trabajo - sólo para nombrar unos pocos - se puede encontrar por ejemplo en

  • git: //git.netfilter.org/libmnl (lado del espacio de usuario)
  • net/core/rtnetlink .c (base netlink)
  • net/netfilter/nf_conntrack_netlink.c (nfnetlink)
  • fs/quota/netlink.c (genetlink)
3

Esto incluye todos los tipos de ejemplos :)

http://people.ee.ethz.ch/~arkeller/linux/kernel_user_space_howto.html

+1

Su derecho el enlace contiene mucha información útil, pero los enlaces no son respuestas. Consulte http://stackoverflow.com/questions/how-to-answer, que explica por qué los enlaces simples no son lo que SO quiere. – stsquad

+0

respondí "" ¿Qué otras opciones tenemos para la comunicación entre el programa de usuario y el módulo de Linux kernel? "" Parte de la pregunta ... si hubieras preguntado otras opciones y cómo funcionan, habría escrito un par de páginas sobre ellos, la razón por la que te di ese enlace, ya que tiene ejemplos de trabajo junto con ellos, que pensé que se explica por sí mismo. – Santi1986

+1

Como las páginas de stackoverflow explican que los enlaces a páginas externas pueden ser transitorios. Si el enlace a la página desaparece, la respuesta de repente se vuelve inútil. Nadie está sugiriendo que necesite escribir un ensayo, pero un resumen de las opciones lo habría convertido en una respuesta más útil. – stsquad

1

This Linux document da algunas de las maneras en las que puede interactuar el espacio del núcleo y el usuario (comunicar). Ellos son los siguientes.

  • Procfs, sysfs, y mecanismos similares. Esto también incluye las entradas /dev, y todos los métodos en los que el espacio del kernel expone un archivo en el espacio de usuario (/ proc,/dev, etc. las entradas son básicamente archivos expuestos desde el espacio del kernel).
  • Socket mecanismos basados. Netlink es un tipo de socket, que está especialmente diseñado para la comunicación entre el espacio de usuario y el espacio del kernel.
  • System calls.
  • Upcalls. El kernel ejecuta un código en el espacio de usuario. Por ejemplo, generando un nuevo proceso.
  • mmap - Memoria asignando una región de la memoria del kernel al espacio del usuario. Esto permite que tanto el núcleo como el espacio de usuario puedan leer/escribir en la misma área de memoria.

Aparte de estos, la siguiente lista agrega algunos otros mecanismos que conozco.

  • Interrupts. El espacio de usuario puede generar interrupciones para hablar con el espacio del kernel. Por ejemplo, algunas CPU usan int80 para hacer llamadas al sistema (mientras que otras pueden usar un mecanismo diferente como syscall instrucción). El kernel tiene que definir el manejador de interrupciones correspondiente de antemano.
  • vDSO/vsyscall - Estos son mecanismos en el kernel de Linux para optimizar la ejecución de algunas llamadas al sistema. La idea es tener una región de memoria compartida, y cuando un proceso hace una llamada al sistema, la biblioteca de espacio de usuario obtiene datos de esta región, en lugar de llamar a la llamada al sistema correspondiente. Esto ahorra la sobrecarga del cambio de contexto.
Cuestiones relacionadas