Як libusb отримує доступ до ядра?


10

З того, що я розумію:

  • Взагалі кажучи, драйвер працює в просторі ядра і його можна викликати з простору користувача.
  • Тільки код у просторі ядра може викликати usb речі низького рівня / ioctl
  • libusb є бібліотекою, тому вона буде компілюватися та працювати в просторі користувача

Тож як libusbдосягти низького рівня USB?

Відповіді:


10

Libusb - це бібліотека для взаємодії з USB-пристроями таким же чином, як і curses, - це бібліотека для взаємодії з текстовими терміналами, ALSA (точніше її компонент libasound) - це бібліотека для взаємодії з аудіопристроями тощо. Ядро обробляє апаратні взаємодії. Він надає файли пристроїв , що додатки можуть відкривати для взаємодії з апаратними засобами, через read, writeі системні виклики .ioctl

ioctl це системний виклик: він дозволяє програмам (код рівня користувача) видавати запити, які є процесами ядром.

Libusb дозволяє програмам реєструвати функції зворотного дзвінка, які виконуються, коли пристрій має про що повідомляти. Ось приблизний огляд потоку інформації під кришкою:

  • Електричний сигнал на шині запускає подію на USB-контролері.
  • Контролер USB піднімає сигнал переривання на основний процесор.
  • Процесор виконує обробник переривання в ядрі операційної системи.
  • Ядро помічає, що процес в даний час блокується read, writeабо ioctlсистемний виклик у файлі пристрою, і викликає повернення цього системного виклику.
  • У процесі наземного користування, коли системний виклик повертається, виконується код бібліотеки.
  • Код бібліотеки виконує функцію зворотного виклику, зареєстровану програмістом програми.

тому не потрібно писати драйвери пристроїв для usb-пристроїв? (якщо не можливо для оптимізації швидкості)
Томас

@Thomas Вам потрібно написати драйвер ядра, якщо ви хочете підключитися до рамки, незалежної від транспорту: клавіатура, сховище, Ethernet тощо. В іншому випадку, я думаю, що вам потрібен драйвер лише у випадку, коли затримка програми userland занадто велика.
Жил "ТАК - перестань бути злим"

Якщо пристрій не розпізнається комп'ютером (для нього немає драйвера), все libusbодно зможете отримати доступ до нього?
Томас

@Thomas Я не знаю, чи може libusb впоратися з усіма аспектами протоколу USB, але в принципі, так. Програма userland може спілкуватися з будь-яким послідовним пристроєм RS232 через /dev/ttyS*. USB - той самий принцип, тільки швидший і складніший.
Жил "ТАК - перестань бути злим"

3

Linux використовує два кільця кільця 0 називається рівнем ядра, кільце 3 називається рівнем користувача. Підключення від користувача до ядра здійснюється (як уже було сказано) за допомогою syscalls. Між ними знаходяться бібліотеки, як видно з користувальницької країни. Отже, доступ до ядра найнижчого рівня реалізований в бібліотеках з міркувань стабільності, безпеки, синхронізації, збереження проміжків тощо. Ядро-драйвер забезпечує різні інтерфейси для призначеного для користувача рівня: (IOCTL, sysfs, розеток, характер і блокових пристроїв і т.д.) в просторі користувача інтерфейсів . Отже, якщо ви хочете, ви можете реалізувати доступ до драйвера ядра, самостійно опустивши бібліотеки, або набагато простіше компілювати свій двійковий файл зі статичними пов'язаними бібліотеками.

Хорошим початковим пунктом є читання джерел libusb, вони добре задокументовані.


0

Він використовує системні дзвінки (2) та файли пристроїв, підготовлені ядром ( /dev/bus/usb/*)


Отже, все працює так, ніби ядро ​​зробило спеціальний драйвер для невідомих пристроїв, який приймає читання та запис? Як нас повідомляють про перебої тощо?
Томас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.