know check linux-kernel linux-device-driver kernel-module

linux-kernel - check - command to know kernel version in linux



¿Qué opciones tenemos para la comunicación entre un programa de usuario y un Módulo Kernel de Linux? (4)

Su opción 3) es realmente una subopción de la opción 1) - ioctl() es una forma de interactuar con un archivo de dispositivo ( read() y write() son las formas habituales).

Otras dos formas que vale la pena considerar son:

  • El sistema de archivos sysfs ;
  • Sockets Netlink.

Soy un recién llegado a la programación de Linux Kernel Module. Del material que he leído hasta ahora, he encontrado que hay tres formas en que un programa de usuario puede solicitar servicios o comunicarse con un Módulo Kernel de Linux.

  1. un archivo de dispositivo 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 de kernel de Linux?


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

  1. Archivo y archivo mapeado en memoria: un archivo de dispositivo (como el anterior) o un archivo similar similar en / dev, procfs, sysfs, debugfs o un sistema de archivos propio, producto cartesiano con lectura / escritura, ioctl, mmap

  2. Posiblemente señales (para usar con kthread)

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

Además,

4. Llamadas al sistema (aunque realmente no se pueden usar desde los módulos)

5. Interfaces de red (similar a tun).

Ejemplos de trabajo de Netlink, por nombrar algunos, se pueden 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)


Este documento de Linux proporciona algunas de las formas en que el kernel y el espacio de usuario pueden interactuar (comunicarse). 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).
  • Mecanismos basados ​​en el Socket 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 mapeando una región de la memoria del núcleo 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 utilizan int80 para hacer llamadas al sistema (mientras que otras pueden usar un mecanismo diferente, como la instrucción syscall ). 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.