Різниця у використанні між файлами пристрою, 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?
Ізраїль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.