Nutzungsunterschied zwischen Gerätedateien, ioctl, sysfs, netlink

12

Ich versuche zu klären, welche Methode (in Bezug auf die Funktionalität) für die Interaktion mit Geräten unter Linux am nützlichsten ist. Soweit ich weiß, stellen Gerätedateien nur einen Teil der Funktionalität zur Verfügung (Adressblöcke in Blockgeräten, Streams in Zeichengeräten usw.). ioctl(2)scheint am häufigsten verwendet zu werden, aber einige Leute sagen, es sei nicht sicher und so weiter.

Einige gute Artikel oder andere relevante Hinweise wären willkommen.

Konstantin
quelle

Antworten:

9

ioctlneigt dazu, mit einem /devEintrag Hand in Hand zu gehen ; Ihr typischer Code würde reichen

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

Dies ist das Standard-Unix-Verhalten. Innerhalb des Kerneltreibers können Sie Zugriffskontrollen einfügen (z. B. nur rooteinige Dinge tun oder eine bestimmte Funktion für einen feinkörnigeren Zugriff erfordern), was ihn ziemlich flexibel und leistungsstark macht.

Dies bedeutet natürlich, dass Geräte viel mehr als nur Block- / Zeichen-Lese- / Schreibaktivitäten verwenden können. Viele Dinge können über ioctlAnrufe erledigt werden . Gar nicht so einfach zu verwenden , um von Shell - Skripten, aber ziemlich einfach aus Coder perloder pythonoder ähnlichem.

sysfsEinträge sind eine weitere Möglichkeit, mit Treibern zu interagieren. Normalerweise hat jeder Befehlstyp einen anderen Eintrag, so dass das Schreiben des Treibers kompliziert sein kann, der Zugriff über den Benutzerbereich jedoch sehr einfach ist. Einfache Shell-Skripte können viele Dinge manipulieren, sind aber möglicherweise nicht sehr effizient

netlinkkonzentriert sich hauptsächlich (glaube ich!) auf Netzwerkdatenübertragungen, könnte aber auch für andere Zwecke verwendet werden. Es ist wirklich gut für größere Datenübertragungsmengen und soll ioctlin einigen Fällen ein Nachfolger sein .

Alle Optionen sind gut; Ihr Anwendungsfall kann besser bestimmen, welche Art von Schnittstelle von Ihrem Treiber verfügbar gemacht werden soll.

Stephen Harris
quelle
1
Fügen Sie mehr hinzu, um zu verwirren: "ioctl: Allerdings ist ioctl im Kernel veraltet, und es wird schwierig sein, Treiber mit neuen Verwendungen von ioctl zu finden, die im Upstream akzeptiert werden. Die Kernel-Betreuer mögen ioctl nicht, weil es den Kernel-Code und den Anwendungscode zu stark voneinander abhängig macht und es ist schwierig, beide über Kernelversionen und Architekturen hinweg auf dem Laufenden zu halten. " [Seite 255] "Mastering Embedded Linux Programming" von Chris Simmonds [2017].
Israr
Dies fügt eine Frage hinzu: Können wir dann von C aus auf sysfs zugreifen?
Israr