In che modo libusb accede alle cose del kernel?


10

Da quello che ho capito:

  • In generale, un driver viene eseguito nello spazio del kernel e può essere chiamato dallo spazio utente.
  • Solo il codice nello spazio del kernel può chiamare cose USB di basso livello / ioctl
  • libusb è una libreria, quindi verrà compilata ed eseguita nello spazio utente

Quindi, come si libusbottiene un basso livello USB?

Risposte:


10

Libusb è una libreria per interagire con dispositivi USB nello stesso modo in cui maledizioni è una libreria per interagire con terminali di testo, ALSA (più precisamente il suo componente libasound) è una libreria per interagire con dispositivi audio, ecc. Il kernel gestisce le interazioni hardware. Esso fornisce i file di dispositivo che le applicazioni possono aprire per interagire con l'hardware, attraverso read, writee chiamate di sistema .ioctl

ioctl è una chiamata di sistema: consente alle applicazioni (codice a livello di utente) di inviare richieste che sono processi del kernel.

Libusb consente alle applicazioni di registrare le funzioni di callback che vengono eseguite quando il dispositivo ha qualcosa da segnalare. Ecco una panoramica generale del flusso di informazioni sotto il cofano:

  • Il segnale elettrico sul bus attiva un evento sul controller USB.
  • Il controller USB genera un segnale di interruzione sul processore principale.
  • Il processore esegue il gestore di interrupt nel kernel del sistema operativo.
  • Gli avvisi del kernel che un processo è attualmente in un blocco read, writeo ioctlchiamata di sistema sul file del dispositivo e le cause che la chiamata di sistema per riportare.
  • Nel processo di destinazione dell'utente, quando viene restituita la chiamata di sistema, viene eseguito il codice della libreria.
  • Il codice della libreria esegue la funzione di richiamata registrata dal programmatore dell'applicazione.

quindi non è necessario scrivere driver di dispositivo per dispositivi USB? (tranne forse per l'ottimizzazione della velocità)
Thomas

@Thomas Devi scrivere un driver del kernel se vuoi collegarti a un framework indipendente dal trasporto: tastiera, memoria, Ethernet, ecc. Altrimenti, penso che tu abbia bisogno di un driver solo se la latenza di un programma utente è troppo alta.
Gilles 'SO- smetti di essere malvagio' il

Se un dispositivo non viene riconosciuto dal computer (nessun driver per esso), sarà libusbcomunque in grado di accedervi?
Thomas,

Thomas Non so se libusb può far fronte a tutti gli aspetti del protocollo USB, ma in linea di principio sì. Un programma utente può comunicare con qualsiasi dispositivo seriale RS232, tramite /dev/ttyS*. USB è lo stesso principio, solo più veloce e più complesso.
Gilles 'SO- smetti di essere malvagio' il

3

Linux usa due anelli l' anello 0 è chiamato livello kernel, l'anello 3 è chiamato livello utente. La connessione da utente a kernel viene effettuata (come già detto) tramite syscalls. Tra loro ci sono le librerie, come si vede dalla terra dell'utente. Quindi l'accesso di livello più basso al kernel è implementato nelle librerie, per motivi di stabilità, sicurezza, sincronizzazione, spazio di salvataggio e così via. Il driver del kernel fornisce diverse interfacce per l'utente: (ioctl, sysfs, socket, dispositivi a caratteri e blocchi e così via) User Space Interfaces . Quindi, se vuoi, puoi implementare il tuo accesso al driver del kernel da solo omettendo le librerie o compilare molto più facilmente il tuo binario con librerie collegate statiche.

Un buon punto di partenza è leggere le fonti libusb, che sono ben documentate.


0

Usa syscalls (2) e file dispositivo preparati dal kernel ( /dev/bus/usb/*)


Quindi tutto funziona come se il kernel avesse creato un driver speciale per dispositivi sconosciuti che accettano letture e scritture? Come siamo avvisati degli interrupt e così via?
Thomas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.