Разница в использовании файлов устройств, ioctl, sysfs, netlink

12

Я пытаюсь уточнить, какой метод взаимодействия с устройствами в Linux является наиболее полезным (с точки зрения функциональности). Как я понимаю, файлы устройств предоставляют только часть функциональности (адресные блоки в блочных устройствах, потоки в символьных устройствах и т. Д.). ioctl(2)кажется, чаще всего используется, но некоторые люди говорят, что это небезопасно, и так далее.

Некоторые хорошие статьи или другие соответствующие ссылки будут приветствоваться.

Константин
источник

Ответы:

9

ioctlстремится идти рука об руку со /devвходом; ваш типичный код будет делать

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

Это совершенно стандартное поведение Unix. Внутри драйвера ядра вы можете поместить элементы управления доступом (например, rootможете делать только некоторые вещи или требовать особой возможности для более детального доступа), что делает его довольно гибким и мощным.

Конечно, это означает, что устройства могут предоставлять гораздо больше, чем просто использовать чтение / запись блоков / символов; многие вещи можно сделать с помощью ioctlзвонков. Не так просто использовать из сценариев оболочки, но довольно легко из Cили perlили pythonили аналогичным.

sysfsзаписи являются еще одним способом взаимодействия с драйверами. Как правило, каждый тип команды будет иметь различную запись, поэтому написать драйвер может быть сложно, но это очень облегчает доступ через пользовательское пространство; простые сценарии оболочки могут манипулировать многими вещами, но могут быть не очень эффективными

netlinkв первую очередь ориентирован (я думаю!) на передачу данных по сети, но его можно использовать для других целей. Это действительно хорошо для больших объемов передачи данных и ioctlв некоторых случаях должно быть преемником .

Все варианты хороши; ваш вариант использования может лучше определить, какой тип интерфейса следует использовать в вашем драйвере.

Стивен Харрис
источник
1
Добавим еще больше, чтобы запутать: "ioctl: однако, ioctl устарел в ядре, и вам будет сложно получить какие-либо драйверы с новым использованием ioctl, принятым в апстриме. Сопровождающие ядра не любят ioctl, потому что он делает код ядра и код приложения слишком взаимозависимыми и трудно держать их в шаге между версиями ядра и архитектурами ». [Страница 255] «Освоение программирования на встроенном Linux» Криса Симмондса [2017].
Исрар
Это добавляет вопрос: тогда мы можем получить доступ к sysfs из C?
Исрар