libusbはカーネルにどのようにアクセスしますか?


10

私が理解していることから:

  • 一般的に言えば、ドライバーはカーネル空間で実行され、ユーザー空間から呼び出すことができます。
  • カーネル空間内のコードのみが、USB低レベルのものを呼び出すことができます/ ioctl
  • libusb ライブラリなので、ユーザー空間でコンパイルして実行します

では、どのようにしてlibusb低レベルUSBを実現するのでしょうか?

回答:


10

Libusbは、cursesがテキスト端末とやり取りするライブラリと同じようにUSBデバイスとやり取りするライブラリです。ALSA(より正確には、そのlibasoundコンポーネント)は、audiデバイスなどとやり取りするライブラリです。カーネルは、ハードウェアのやり取りを処理します。それは提供してデバイスファイルをアプリケーションがを通じて、ハードウェアとの対話を開くことができreadwriteおよびシステムコールioctl

ioctl システムコールです。これにより、アプリケーション(ユーザーレベルのコード)がカーネルによって処理される要求を発行できます。

Libusbを使用すると、アプリケーションは、デバイスにレポートする何かがあるときに実行されるコールバック関数を登録できます。ここでは、内部の情報フローの大まかな概要を示します。

  • バス上の電気信号は、USBコントローラーでイベントをトリガーします。
  • USBコントローラは、メインプロセッサで割り込み信号を発生させます。
  • プロセッサは、オペレーティングシステムカーネルで割り込みハンドラを実行します。
  • プロセスがブロッキングに現在あることをカーネルの通知readwriteまたはioctlデバイス・ファイルのシステムコールとリターンにそのシステムコールが発生します。
  • ユーザーランドプロセスでは、システムコールが戻ると、ライブラリコードが実行されます。
  • ライブラリコードは、アプリケーションプログラマによって登録されたコールバック関数を実行します。

USBデバイス用のデバイスドライバーを作成する必要はありませんか?(速度の最適化のためでない限り)
Thomas

@Thomasトランスポートに依存しないフレームワーク(キーボード、ストレージ、イーサネットなど)にプラグインする場合は、カーネルドライバーを作成する必要があります。それ以外の場合は、ユーザーランドプログラムのレイテンシが高すぎる場合にのみドライバーが必要だと思います。
ジル 'SO-邪悪なことをやめなさい'

デバイスがコンピューターに認識されない(ドライバーがない)場合でも、デバイスlibusbにアクセスできますか?
Thomas

@Thomas libusbがUSBプロトコルのすべての側面に対応できるかどうかはわかりませんが、原則としてそうです。ユーザーランドプログラムは、RS232シリアルデバイスと通信でき/dev/ttyS*ます。USBも同じ原理ですが、より高速で複雑です。
Gilles 'SO-邪悪なことをやめ

3

Linuxは2つのリングを使用します。リング0はカーネルレベルと呼ばれ、リング3はユーザーレベルと呼ばれます。ユーザーからカーネルへの接続は、(既に述べたように)syscallsを介して行われます。それらの間には、ユーザーランドから見たライブラリがあります。したがって、安定性、セキュリティ、同期、保存間隔などの理由から、カーネルへの最も低レベルのアクセスはライブラリに実装されています。カーネルドライバーは、ユーザーランドへのさまざまなインターフェイスを提供します:(ioctl、sysfs、ソケット、キャラクターデバイス、ブロックデバイスなど)ユーザー空間インターフェイス。そのため、必要に応じて、ライブラリを省略してカーネルドライバーへのアクセスを実装するか、静的リンクライブラリを使用してバイナリをはるかに簡単にコンパイルできます。

良い出発点はlibusbソースを読むことです、それらは十分に文書化されています。


0

それが使用するシステムコール(2)カーネルにより調製し、デバイスファイルを(/dev/bus/usb/*


カーネルが読み取りと書き込みを受け入れる不明なデバイス用の特別なドライバーを作成したかのようにすべてが機能しますか?割り込みなどはどのように通知されますか?
トーマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.