2010-05-25 9 views
10

¿Cuáles son las formas de comunicarse con un módulo kernel desde el espacio de usuario? Por comunicación quiero decir enviar información y comandos entre el módulo kernel y un proceso de espacio de usuario.¿Cómo comunicarse con un módulo de kernel de Linux desde el espacio de usuario sin tirar basura/dev con nuevos nodos?

Actualmente sé de dos vías:

  1. /cierre/leer/escribir/ioctl abierta en nodo de dispositivo publicada.
  2. leer/escribir en archivo exportado y enganchado/proc.

Más específicamente, ¿alguien puede aconsejar la mejor manera de comunicarse con un módulo kernel que realmente no maneja ningún hardware y por lo tanto no debería ensuciar/dev con nodos que existe únicamente para llamadas ioctl? En su mayoría, necesito verificar sus diversas variables de estado y enviar un bloque de datos con una etiqueta de tipo de solicitud y ver si la solicitud tuvo éxito.

Respuesta

2

El tercero es agregar un nuevo syscall, pero los dos que ha escrito son los preferidos, creo. Encontré este documento que podría ayudar, pero sigo pensando que esta opción no es recomendada: http://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_add_systemcall.html

Otra opción aceptable podría ser compartir la memoria.

+0

que sé acerca de la sustitución de una llamada al sistema de parcheo de la mesa, pero ¿Cómo agrego una nueva? –

+0

Creo que leí sobre esto en el libro Controladores de dispositivos de Linux una vez, déjame echar un vistazo ... – fortran

+4

Los desarrolladores de kernel no recomiendan agregar nuevas llamadas de sistema. En los núcleos más nuevos, deliberadamente lo han hecho más difícil. –

3

También podría leer/escribir desde/dev nodos del dispositivo.

En mi humilde opinión,/dev ya está lleno de cosas y agregar sus propios nodos no es un gran problema. No olvide que puede tener muchos códigos ioctl para un nodo de dispositivo único, y los parámetros ioctl se pasan por referencia, por lo que pueden ser tan grandes como desee.

8

Hay también el sistema de ficheros/sys (sysfs):

Sysfs exporta información acerca del dispositivos y controladores del modelo de dispositivo kernel al espacio de usuario, y es también utilizado para la configuración.

(desde Wikipedia)

0

debugfs es otra buena posibilidad de API que son menos estables que sysfs, pero el API es básicamente el mismo. Aquí hay un minimal runnable example.

configfs es otro.Permite la creación dinámica fácil de los objetos del núcleo del espacio de usuario a través del sistema de archivos: https://www.kernel.org/doc/Documentation/filesystems/configfs/configfs.txt

En cualquier caso, tendrá que sucia algún espacio de nombres ... una entrada de sistema de archivos en caso de sysfs y debugfs. Solo elige tu veneno.

Además, udev reglas hacen /dev muy similar a sysfs y debugfs: How to create a device in /dev automatically upon loading of the kernel module for a device driver?

Cuestiones relacionadas