Differenza di utilizzo tra file dispositivo, ioctl, sysfs, netlink


12

Sto cercando di chiarire quale sia il metodo più utile (in termini di funzionalità) per interagire con i dispositivi in ​​Linux. A quanto ho capito, i file dei dispositivi espongono solo una parte della funzionalità (blocchi di indirizzi nei dispositivi a blocchi, flussi nei dispositivi a caratteri, ecc ...). ioctl(2)sembra essere più comunemente usato, ma alcune persone dicono che non è sicuro, e così via.

Alcuni buoni articoli o altri suggerimenti pertinenti sarebbero i benvenuti.

Risposte:


9

ioctltende ad andare di pari passo con una /devvoce; il tuo codice tipico farebbe

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

Questo è un comportamento Unix perfettamente standard. All'interno del driver del kernel è possibile inserire controlli di accesso (ad esempio, è rootpossibile solo fare alcune cose o richiedere una capacità specifica per un accesso più preciso) che lo rende piuttosto flessibile e potente.

Ovviamente questo significa che i dispositivi possono esporre molto più che utilizzare l'attività di lettura / scrittura a blocchi / caratteri; molte cose possono essere fatte tramite ioctlchiamate. Non è così facile da usare dagli script della shell, ma abbastanza facile da Co perlo pythono simili.

sysfsle voci sono un altro modo di interagire con i driver. In genere ogni tipo di comando avrebbe una voce diversa, quindi può essere complicato scrivere il driver ma rende molto facile l'accesso tramite spazio utente; semplici script di shell possono manipolare molte cose, ma potrebbero non essere molto efficienti

netlinkè principalmente focalizzato (penso!) sui trasferimenti di dati di rete, ma potrebbe essere usato per altre cose. È davvero buono per grandi volumi di trasferimento di dati ed è destinato a essere un successore ioctlin alcuni casi.

Tutte le opzioni sono buone; il tuo caso d'uso potrebbe determinare meglio quale tipo di interfaccia esporre dal tuo driver.


1
Aggiungendo altro da confondere: "ioctl: Tuttavia, ioctl è deprecato nel kernel e troverai difficile ottenere qualsiasi driver con nuovi usi di ioctl accettato a monte. I manutentori del kernel non amano ioctl perché rende il codice del kernel e il codice dell'applicazione troppo interdipendenti ed è difficile mantenerli entrambi al passo tra le versioni e le architetture del kernel ". [Pagina 255] "Mastering Embedded Linux Programming" di Chris Simmonds [2017].
Israr l'

Questo aggiunge una domanda: allora possiamo accedere a sysfs da C?
Israr l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.