W jaki sposób libusb ma dostęp do jądra?

10

Z tego co rozumiem:

  • Mówiąc ogólnie, sterownik działa w przestrzeni jądra i może być wywoływany z przestrzeni użytkownika.
  • Tylko kod w przestrzeni jądra może wywoływać USB niskiego poziomu rzeczy / ioctl
  • libusb jest biblioteką, więc będzie się kompilować i działać w przestrzeni użytkownika

Jak więc libusbosiągnąć niski poziom USB?

Tomasz
źródło

Odpowiedzi:

10

Libusb to biblioteka do interakcji z urządzeniami USB w taki sam sposób, jak curses to biblioteka do interakcji z terminalami tekstowymi, ALSA (a ściślej jej komponent libasound) to biblioteka do interakcji z urządzeniami audio itp. Jądro obsługuje interakcje sprzętowe. Zapewnia plików urządzeń , które aplikacje mogą otwierać do interakcji ze sprzętem, dzięki read, writei wywołań systemowych .ioctl

ioctl jest wywołaniem systemowym: pozwala aplikacjom (kod na poziomie użytkownika) wysyłać żądania przetwarzane przez jądro.

Libusb pozwala aplikacjom rejestrować funkcje zwrotne, które są wykonywane, gdy urządzenie ma coś do zgłoszenia. Oto ogólny przegląd przepływu informacji pod maską:

  • Sygnał elektryczny na magistrali wyzwala zdarzenie w kontrolerze USB.
  • Kontroler USB podnosi sygnał przerwania na głównym procesorze.
  • Procesor wykonuje procedurę obsługi przerwań w jądrze systemu operacyjnego.
  • Jądro spostrzega, że proces jest obecnie w blokowaniu read, writelub ioctlwywołania systemowego o pliku urządzenia i powoduje, że wywołanie systemowe do powrotu.
  • W procesie lądowania użytkownika, gdy wywołanie systemowe powraca, kod biblioteki jest wykonywany.
  • Kod biblioteki wykonuje funkcję wywołania zwrotnego zarejestrowaną przez programistę aplikacji.
Gilles „SO- przestań być zły”
źródło
więc nie musisz pisać sterowników urządzeń USB? (chyba że w celu optymalizacji prędkości)
Thomas
@Thomas Musisz napisać sterownik jądra, jeśli chcesz podłączyć się do frameworka niezależnego od transportu: klawiatura, pamięć, ethernet itp. W przeciwnym razie myślę, że potrzebujesz sterownika tylko wtedy, gdy opóźnienie programu użytkownika jest zbyt duże.
Gilles „SO- przestań być zły”
Jeśli urządzenie nie zostanie rozpoznane przez komputer (nie ma dla niego sterownika), libusbnadal będzie można uzyskać do niego dostęp?
Thomas
@ Thomas Nie wiem, czy libusb poradzi sobie ze wszystkimi aspektami protokołu USB, ale w zasadzie tak. Program użytkownika może komunikować się z dowolnym urządzeniem szeregowym RS232 za pośrednictwem /dev/ttyS*. USB to ta sama zasada, tylko szybsza i bardziej złożona.
Gilles „SO- przestań być zły”
3

Linux używa dwóch pierścieni pierścień 0 nazywa się na poziomie jądra, pierścień 3 nazywa się na poziomie użytkownika. Połączenie użytkownika z jądrem odbywa się (jak już powiedziano) za pośrednictwem syscall. Pomiędzy nimi są biblioteki, jak widać z przestrzeni użytkownika. Tak więc dostęp do jądra na najwyższym poziomie jest implementowany w bibliotekach ze względu na stabilność, bezpieczeństwo, synchronizację, oszczędzanie odstępów i tak dalej. Sterownik jądra zapewnia różne interfejsy dla przestrzeni użytkownika: (ioctl, sysfs, gniazda, urządzenia znakowe i blokowe itd.) Interfejsy przestrzeni użytkownika . Jeśli chcesz, możesz zaimplementować dostęp do sterownika jądra, pomijając biblioteki lub znacznie łatwiej skompilować plik binarny ze statycznie połączonymi bibliotekami.

Dobrym punktem wyjścia jest przeczytanie źródeł libusb, są one dobrze udokumentowane.


źródło
0

Wykorzystuje syscalls (2) i pliki urządzeń przygotowane przez jądro ( /dev/bus/usb/*)

UVV
źródło
Więc wszystko działa tak, jakby jądro stworzyło specjalny sterownik dla nieznanych urządzeń, który akceptuje odczyty i zapisy? Jak jesteśmy powiadamiani o przerwaniach i tak dalej?
Thomas