Diferencia de uso entre archivos de dispositivo, ioctl, sysfs, netlink

12

Estoy tratando de aclarar cuál es el método más útil (en términos de funcionalidad) para interactuar con dispositivos en Linux. Según tengo entendido, los archivos de dispositivo exponen solo una parte de la funcionalidad (bloques de direcciones en dispositivos de bloque, secuencias en dispositivos de caracteres, etc.). ioctl(2)parece ser el más utilizado, pero algunas personas dicen que no es seguro, y así sucesivamente.

Algunos buenos artículos u otros indicadores relevantes serían bienvenidos.

Constantina
fuente

Respuestas:

9

ioctltiende a ir de la mano con una /deventrada; tu código típico haría

fd=open("/dev/mydevice",O_RDRW);
ioctl(fd,.....);

Este es un comportamiento perfectamente estándar de Unix. Dentro del controlador del kernel puede colocar controles de acceso (por ejemplo, solo rootpuede hacer algunas cosas o requerir una capacidad específica para un acceso más preciso) lo que lo hace bastante flexible y potente.

Por supuesto, esto significa que los dispositivos pueden exponer mucho más que usar la actividad de lectura / escritura de bloque / carácter; Se pueden hacer muchas cosas a través de ioctlllamadas. No es tan fácil de usar desde scripts de shell, pero bastante fácil de Co perlo pythono similar.

sysfsLas entradas son otra forma de interactuar con los controladores. Normalmente, cada tipo de comando tendría una entrada diferente, por lo que puede ser complicado escribir el controlador, pero hace que sea muy fácil acceder a través del espacio de usuario; los scripts de shell simples pueden manipular muchas cosas, pero pueden no ser muy eficientes

netlinkse centra principalmente (¡creo!) en transferencias de datos de red, pero podría usarse para otras cosas. Es realmente bueno para grandes volúmenes de transferencia de datos y está destinado a ser un sucesor ioctlen algunos casos.

Todas las opciones son buenas; su caso de uso puede determinar mejor qué tipo de interfaz exponer de su controlador.

Stephen Harris
fuente
1
Agregando más para confundir: "ioctl: Sin embargo, ioctl está en desuso en el kernel, y le resultará difícil obtener controladores con nuevos usos de ioctl aceptados en sentido ascendente. , y es difícil mantenerlos a ambos en las versiones y arquitecturas del núcleo ". [Página 255] "Mastering Embedded Linux Programming" por Chris Simmonds [2017].
Israr
Esto agrega una pregunta: ¿Entonces podemos acceder a sysfs desde C?
Israr