Comment libusb accède-t-il au noyau?

10

D'après ce que je comprends:

  • De manière générale, un pilote s'exécute dans l'espace noyau et peut être appelé depuis l'espace utilisateur.
  • Seul le code dans l'espace du noyau peut appeler des choses de bas niveau usb / ioctl
  • libusb est une bibliothèque, donc elle se compile et s'exécute dans l'espace utilisateur

Alors, comment libusbobtenir un USB de bas niveau?

Thomas
la source

Réponses:

10

Libusb est une bibliothèque pour interagir avec des périphériques USB de la même manière que curses est une bibliothèque pour interagir avec des terminaux texte, ALSA (plus précisément son composant libasound) est une bibliothèque pour interagir avec des périphériques audi, etc. Le noyau gère les interactions matérielles. Il fournit des fichiers de périphériques que les applications peuvent ouvrir d'interagir avec le matériel, par le biais read, writeet les appels système .ioctl

ioctl est un appel système: il permet aux applications (code de niveau utilisateur) d'émettre des requêtes qui sont des processus par le noyau.

Libusb permet aux applications d'enregistrer des fonctions de rappel qui sont exécutées lorsque l'appareil a quelque chose à signaler. Voici un aperçu approximatif du flux d'informations sous le capot:

  • Le signal électrique sur le bus déclenche un événement sur le contrôleur USB.
  • Le contrôleur USB déclenche un signal d'interruption sur le processeur principal.
  • Le processeur exécute le gestionnaire d'interruption dans le noyau du système d'exploitation.
  • Les avis du noyau qu'un processus est actuellement un blocage read, writeou ioctlappel système sur le fichier de l' appareil et provoque cet appel à un retour du système.
  • Dans le processus Land utilisateur, lorsque l'appel système revient, le code de bibliothèque est exécuté.
  • Le code de bibliothèque exécute la fonction de rappel enregistrée par le programmeur d'application.
Gilles 'SO- arrête d'être méchant'
la source
donc pas besoin d'écrire des pilotes de périphériques pour les périphériques USB? (sauf peut-être pour l'optimisation de la vitesse)
Thomas
@Thomas Vous devez écrire un pilote de noyau si vous souhaitez vous connecter à un framework indépendant du transport: clavier, stockage, Ethernet, etc. Sinon, je pense que vous n'avez besoin d'un pilote que si la latence d'un programme utilisateur est trop élevée.
Gilles 'SO- arrête d'être méchant'
Si un périphérique n'est pas reconnu par l'ordinateur (pas de pilote pour lui), pourra-t-il libusbtoujours y accéder?
Thomas
@Thomas Je ne sais pas si libusb peut gérer tous les aspects du protocole USB, mais en principe, oui. Un programme utilisateur peut communiquer avec n'importe quel périphérique série RS232 via /dev/ttyS*. L'USB est le même principe, mais plus rapide et plus complexe.
Gilles 'SO- arrête d'être méchant'
3

Linux utilise deux anneaux l' anneau 0 est appelé au niveau du noyau, l'anneau 3 est appelé au niveau de l'utilisateur. La connexion de l'utilisateur au noyau se fait (comme cela a déjà été dit) via syscalls. Entre elles se trouvent les bibliothèques, vues depuis l'espace utilisateur. Ainsi, l'accès le plus bas niveau au noyau est implémenté dans les bibliothèques, pour des raisons de stabilité, de sécurité, de synchronisation, d'économie d'espace, etc. Le pilote du noyau fournit différentes interfaces à l'espace utilisateur: (ioctl, sysfs, sockets, périphériques de caractères et blocs, etc.) Interfaces d'espace utilisateur . Donc, si vous le souhaitez, vous pouvez implémenter votre accès au pilote du noyau en omettant vous-même les bibliothèques, ou bien plus facilement compiler votre binaire avec des bibliothèques liées statiques.

Un bon point de départ est de lire les sources libusb, elles sont bien documentées.


la source
0

Il utilise des syscalls (2) et des fichiers de périphériques préparés par le noyau ( /dev/bus/usb/*)

UVV
la source
Donc, tout fonctionne comme si le noyau avait créé un pilote spécial pour les périphériques inconnus qui accepte les lectures et les écritures? Comment sommes-nous informés des interruptions, etc.?
Thomas