web-dev-qa-db-ja.com

Linuxドライバー:ioctlまたはsysfs?

私はいくつかのカスタムハードウェアを制御するためのドライバーを書いています。

昔(つまり15年前)はioctlsでこれを行っていましたが、現在は可能な代替手段としてsysfsを掘り下げています。

  • 私が理解しているように、ioctlは完全に非推奨ではありませんが、sysfsが推奨されます(?)
  • 値のセットを同時に、つまり1つのsysfsエントリを介して読み取り/書き込みする必要があります。これは理想的ではないことを読みましたが、必要に応じて許容できます(?)
  • ドライバーには「mutex」保護が必要です。これにより、一度に1つのアプリのみがドライバーに書き込むことができます。 (私は、いつでもアクセスできるようにしておきたい読み取り専用の「info」エントリをいくつか持っています)。

上記を考えると、続行するための最良の方法は何ですか?ioctlまたはsysfs?

Sysfsの場合、排他的アクセスを実装するにはどうすればよいですか?

Sysfsの場合、ドライバーに読み取り/書き込み/ ioctl fopsがない場合、開く/解放する必要がありますか?!

(これは「プライベート」ドライバーなので、あまり気にしません;)しかし、新しい方法がより適切であるかどうかを考えたので、私はそれらを理解したほうがよいでしょう!)

ありがとう。

15
ColH

私はあなたの質問に少なくとも部分的に答えようとします。コメントして、拡大(または縮小)するように依頼してください。

  • まず第一に、人々が解決するすべての問題に対するより良い解決策を見つけていないため、最近のioctlは非推奨とは見なされなくなりました。しかし、人々はioctlインターフェースを定義することにより規律があり、可能であれば、ioctl番号エンコーディングで読み書きするものを正直に表現することが期待されています。 ioctlとsysfsには異なる長所があります。
  • sysfsは主に、デバイスの特定の属性をユーザースペース、特にコンソールまたはシェルスクリプトのユーザーに公開し、それらの属性またはデバイス構成を変更できるようにする場合に役立ちます。単一のsysfsファイルは通常、単一の属性にマップされ、通常、単純なテキスト文字列として読み取り可能(および/または書き込み可能)です。たとえば、デバイスの現在の電源管理状態(「オフ」など)を公開し、「cat」シェルコマンドを使用して新しい電源管理状態を記述できるようにする場合があります。
  • sysfsは確かにオープン/リリースセッションに関連付けられていないため(使用するためにそれらを実装する必要はありません)、おそらくグローバル属性にのみ本当に適しています。ユーザーがデバイスで一度に1つの操作のみを実行することが予想される場合は問題ありませんが、強制するのが難しくなります(したがって、すべてをエンコードしない限り、「データセットを同時に」使用するのはおそらく理想的ではありません1つの文字列)。そして、はい、ミューテックスを使用してsysfsハンドラーからアクセスするドライバーデータを保護する必要があります。おそらく、データの論理セットごとに1つのミューテックス(または複数の論理セットに対して1つ)です。
  • ioctlは、ユーザースペースとドライバーの間でバイナリ情報を渡すのに適していて、それを使用するにはCプログラムなどが必要です。カスタムioctlは、カーネルに最小限のドライバーを記述し、対応するユーザースペースプログラムにロジックを配置するのに適しています。 sysfsとは異なり、テキスト文字列を解釈するための追加のロジックは必要ありません。ユーザープロセスメモリから直接データを読み書きできます。つまり、不要なコードが少なくなりますが、データを完全に安全にチェックしない機会も増えます。
18
michaeljt