Différence d'utilisation entre les fichiers de périphérique, ioctl, sysfs, netlink

12

J'essaie de clarifier quelle est la méthode la plus utile (en termes de fonctionnalités) pour interagir avec les périphériques sous Linux. Si je comprends bien, les fichiers de périphérique n'exposent qu'une partie des fonctionnalités (blocs d'adresse dans les périphériques de bloc, flux dans les périphériques de caractères, etc.). ioctl(2)semble être le plus couramment utilisé, mais certaines personnes disent que ce n'est pas sûr, etc.

De bons articles ou d'autres conseils pertinents seraient les bienvenus.

Constantine
la source

Réponses:

9

ioctla tendance à aller de pair avec une /deventrée; votre code typique ferait

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

C'est un comportement Unix parfaitement standard. À l'intérieur du pilote du noyau, vous pouvez placer des contrôles d'accès (par exemple, seuls rootcertains peuvent faire certaines choses, ou nécessitent une capacité spécifique pour un accès plus fin), ce qui le rend assez flexible et puissant.

Bien sûr, cela signifie que les appareils peuvent exposer beaucoup plus que d'utiliser une activité de lecture / écriture de bloc / caractère; beaucoup de choses peuvent être faites via des ioctlappels. Pas si facile à utiliser à partir de scripts shell, mais assez facile à partir Cou perlou pythonou similaire.

sysfsles entrées sont une autre façon d'interagir avec les pilotes. Typiquement, chaque type de commande aurait une entrée différente, donc il peut être compliqué d'écrire le pilote mais il est très facile d'accéder via l'espace utilisateur; les scripts shell simples peuvent manipuler beaucoup de choses, mais peuvent ne pas être très efficaces

netlinkest principalement concentré (je pense!) sur les transferts de données réseau, mais il pourrait être utilisé pour d'autres choses. C'est vraiment bon pour des volumes plus importants de transfert de données et est censé être un successeur ioctldans certains cas.

Toutes les options sont bonnes; votre cas d'utilisation peut mieux déterminer le type d'interface à exposer à partir de votre pilote.

Stephen Harris
la source
1
Ajouter plus à confondre: "ioctl: Cependant, ioctl est déconseillé dans le noyau, et vous aurez du mal à obtenir des pilotes avec de nouvelles utilisations d'ioctl acceptées en amont. Les responsables du noyau n'aiment pas ioctl parce que le code du noyau et le code d'application sont trop interdépendants , et il est difficile de les maintenir en phase dans les versions et architectures du noyau. " [Page 255] "Maîtriser la programmation Linux embarquée" par Chris Simmonds [2017].
Israr
Cela ajoute une question: Alors pouvons-nous accéder aux sysfs à partir de C?
Israr