2016-11-10 32 views
8

カスタムハードウェアを制御するドライバを作成しています。Linuxドライバ:ioctlまたはsysfs?

昨日(つまり15年前)私はioctlsでこれをやっていましたが、可能な代替手段としてsysfsに掘り下げています。

  • 私はそれを理解したよう

    は、ioctlは完全に廃止予定されていませんが、sysfsのは、私は1つのsysfsエントリを通じて同時に、すなわち値の/書き込みセットを読み取る必要がある(?)
  • 好ましいです。
  • ドライバに「mutex」の保護が必要であるため、一度に1つのアプリケーションしか書き込みできないようにする必要があります。 (私はいつもすべての人にアクセス可能にしたいと思ういくつかの読み込み専用の「情報」項目を持っています)。

上記を踏まえて、ioctlまたはsysfsを進めるにはどうすればよいでしょうか?

sysfsの場合、どのように排他アクセスを実装できますか?

sysfsの場合、ドライバに読み取り/書き込み/ ioctl fopsがない場合、オープン/リリースが必要ですか?

(これは「プライベート」ドライバーですので、私は大規模な気にしない;)!が、新しい方法がより適用されるならば、私も彼らとグリップを得るかもしれない考え出し)

感謝。

答えて

8

私はあなたの質問に少なくとも部分的に答えようとします。

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

ビューマイケルに感謝します。私はトレードオフのあなたの認識が私が持っていた感じと一致すると思う、 – ColH

+0

おそらくあなたはあなたに妥当と思われる答えを "受け入れる"ことができますか?ありがとう。 – michaeljt

関連する問題