Bagaimana libusb mengakses kernel?

10

Dari apa yang saya mengerti:

  • Secara umum, driver berjalan dalam ruang kernel dan dapat dipanggil dari ruang pengguna.
  • Hanya kode dalam ruang kernel yang dapat memanggil hal-hal tingkat rendah usb / ioctl
  • libusb adalah perpustakaan, sehingga akan dikompilasi dan dijalankan di ruang pengguna

Jadi bagaimana cara libusbmencapai USB level rendah?

Thomas
sumber

Jawaban:

10

Libusb adalah pustaka untuk berinteraksi dengan perangkat USB dengan cara yang sama dengan kutukan adalah pustaka untuk berinteraksi dengan terminal teks, ALSA (lebih tepatnya komponen libasound-nya) adalah pustaka untuk berinteraksi dengan perangkat audi, dll. Kernel menangani interaksi perangkat keras. Ini memberikan file perangkat yang dapat dibuka aplikasi untuk berinteraksi dengan perangkat keras, melalui read, writedan panggilan sistem .ioctl

ioctl adalah panggilan sistem: memungkinkan aplikasi (kode tingkat pengguna) untuk mengeluarkan permintaan yang diproses oleh kernel.

Libusb memungkinkan aplikasi untuk mendaftarkan fungsi panggilan balik yang dieksekusi ketika perangkat memiliki sesuatu untuk dilaporkan. Berikut ini gambaran umum kasar dari arus informasi di bawah tenda:

  • Sinyal listrik pada bus memicu suatu kejadian pada pengontrol USB.
  • Pengontrol USB menimbulkan sinyal interupsi pada prosesor utama.
  • Prosesor mengeksekusi pengendali interupsi di kernel sistem operasi.
  • Kernel pemberitahuan bahwa suatu proses saat ini dalam pemblokiran read, writeatau ioctlpanggilan sistem pada file perangkat dan menyebabkan panggilan sistem kembali.
  • Dalam proses pertanahan pengguna, ketika panggilan sistem kembali, kode perpustakaan dieksekusi.
  • Kode perpustakaan mengeksekusi fungsi callback yang terdaftar oleh pemrogram aplikasi.
Gilles 'SANGAT berhenti menjadi jahat'
sumber
jadi tidak perlu menulis driver perangkat untuk perangkat usb? (kecuali mungkin untuk optimasi kecepatan)
Thomas
@ Thomas Anda perlu menulis driver kernel jika Anda ingin mencolokkan kerangka yang bebas transport: keyboard, penyimpanan, ethernet, dll. Jika tidak, saya pikir Anda hanya perlu driver jika latensi program userland terlalu tinggi.
Gilles 'SANGAT berhenti menjadi jahat'
Jika suatu perangkat tidak dikenali oleh komputer (tidak ada driver untuk itu), apakah libusbmasih dapat mengaksesnya?
Thomas
@ Thomas Saya tidak tahu apakah libusb dapat mengatasi semua aspek protokol USB, tetapi pada prinsipnya, ya. Program userland dapat berkomunikasi dengan perangkat serial RS232, melalui /dev/ttyS*. USB adalah prinsip yang sama, hanya lebih cepat dan lebih kompleks.
Gilles 'SANGAT berhenti menjadi jahat'
3

Linux menggunakan dua cincin dering 0 yang disebut kernel-level, cincin 3 disebut tingkat pengguna. Koneksi dari pengguna ke kernel dilakukan (seperti yang sudah dikatakan) melalui syscalls. Di antara mereka adalah perpustakaan, seperti yang terlihat dari userland. Jadi akses tingkat paling rendah ke kernel diimplementasikan di perpustakaan, untuk alasan stabilitas, keamanan, sinkronisasi, menghemat jarak, dan sebagainya. Kernel-driver menyediakan antarmuka berbeda ke tanah pengguna: (ioctl, sysfs, soket, karakter dan perangkat blok dan sebagainya) Antarmuka Antariksa Pengguna . Jadi jika Anda mau, Anda dapat mengimplementasikan akses Anda ke driver kernel sendiri dengan menghilangkan pustaka, atau lebih mudah mengkompilasi biner Anda dengan pustaka yang terhubung secara statis.

Titik awal yang baik adalah membaca sumber libusb, mereka didokumentasikan dengan baik.


sumber
0

Ia menggunakan syscalls (2) dan file perangkat yang disiapkan oleh kernel ( /dev/bus/usb/*)

UVV
sumber
Jadi semuanya berfungsi seolah-olah kernel membuat driver khusus untuk perangkat yang tidak dikenal yang menerima membaca dan menulis? Bagaimana kita diberitahu tentang interupsi dan sebagainya?
Thomas