Wie greift libusb auf Kernel-Inhalte zu?


10

Von dem, was ich verstehe:

  • Im Allgemeinen wird ein Treiber im Kernelbereich ausgeführt und kann vom Benutzerbereich aus aufgerufen werden.
  • Nur Code im Kernelraum kann USB-Low-Level-Dinge aufrufen / ioctl
  • libusb ist eine Bibliothek, daher wird sie kompiliert und im Benutzerbereich ausgeführt

Wie erreicht libusbman also Low-Level-USB?

Antworten:


10

Libusb ist eine Bibliothek zur Interaktion mit USB-Geräten auf die gleiche Weise wie curses eine Bibliothek zur Interaktion mit Textterminals. ALSA (genauer gesagt die libasound-Komponente) ist eine Bibliothek zur Interaktion mit Audiogeräten usw. Der Kernel verwaltet die Hardware-Interaktionen. Es bietet Gerätedateien , die Anwendungen öffnen können mit der Hardware bis hin zu interagieren read, writeund Systemaufrufe .ioctl

ioctl ist ein Systemaufruf: Er ermöglicht es Anwendungen (Code auf Benutzerebene), Anforderungen auszugeben, die vom Kernel verarbeitet werden.

Mit Libusb können Anwendungen Rückruffunktionen registrieren, die ausgeführt werden, wenn das Gerät etwas zu melden hat. Hier ist eine grobe Übersicht über den Informationsfluss unter der Haube:

  • Das elektrische Signal am Bus löst ein Ereignis am USB-Controller aus.
  • Der USB-Controller löst ein Interrupt-Signal am Hauptprozessor aus.
  • Der Prozessor führt den Interrupt-Handler im Betriebssystemkern aus.
  • Die Kernel - bemerkt , dass ein Prozess ist derzeit in einer blockierenden read, writeoder ioctlSystemaufruf auf der Gerätedatei und bewirkt , dass der Systemaufruf zurückzukehren.
  • Wenn der Systemaufruf im Benutzerlandprozess zurückkehrt, wird der Bibliothekscode ausgeführt.
  • Der Bibliothekscode führt die vom Anwendungsprogrammierer registrierte Rückruffunktion aus.

Sie müssen also keine Gerätetreiber für USB-Geräte schreiben? (außer vielleicht zur Geschwindigkeitsoptimierung)
Thomas

@Thomas Sie müssen einen Kerneltreiber schreiben, wenn Sie sich in ein transportunabhängiges Framework einbinden möchten: Tastatur, Speicher, Ethernet usw. Ansonsten benötigen Sie meines Erachtens nur dann einen Treiber, wenn die Latenz eines Userland-Programms zu hoch ist.
Gilles 'SO - hör auf böse zu sein'

Wenn ein Gerät vom Computer nicht erkannt wird (kein Treiber dafür), kann es dann libusbtrotzdem darauf zugreifen?
Thomas

@Thomas Ich weiß nicht, ob libusb alle Aspekte des USB-Protokolls bewältigen kann, aber im Prinzip ja. Ein Userland-Programm kann über mit jedem seriellen RS232-Gerät kommunizieren /dev/ttyS*. USB ist das gleiche Prinzip, nur schneller und komplexer.
Gilles 'SO - hör auf böse zu sein'

3

Linux verwendet zwei Ringe. Ring 0 heißt Kernel-Level, Ring 3 heißt User-Level. Die Verbindung vom Benutzer zum Kernel erfolgt (wie bereits gesagt) über syscalls. Dazwischen befinden sich die Bibliotheken, vom Userland aus gesehen. Aus Gründen der Stabilität, Sicherheit, Synchronisation, Speicherabstand usw. wird der niedrigste Zugriff auf den Kernel in Bibliotheken implementiert. Der Kernel-Treiber bietet verschiedene Benutzeroberflächen für das Benutzerland: (ioctl, sysfs, Sockets, Zeichen- und Blockgeräte usw.) User Space-Schnittstellen . Wenn Sie möchten, können Sie Ihren Zugriff auf den Kerneltreiber implementieren, indem Sie die Bibliotheken weglassen oder Ihre Binärdatei viel einfacher mit statisch verknüpften Bibliotheken kompilieren.

Ein guter Ausgangspunkt ist das Lesen der libusb-Quellen, sie sind gut dokumentiert.


0

Es verwendet Syscalls (2) und Gerätedateien, die vom Kernel ( /dev/bus/usb/*) vorbereitet wurden.


Also funktioniert alles so, als hätte der Kernel einen speziellen Treiber für unbekannte Geräte erstellt, der Lese- und Schreibvorgänge akzeptiert? Wie werden wir über Interrupts usw. informiert?
Thomas
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.