web-dev-qa-db-ja.com

その他のドライバーとcharドライバーの違いは何ですか?

Linuxのその他のドライバーについて読んでいますが、それらとcharドライバーの違いについて少し混乱しています。 1つのソース Linuxジャーナル は次のように書いています:

Alessandroは、単一のエントリポイントを必要とする小さなデバイスをmiscドライバに登録する方法を教えてくれます。

ハードウェアまたはソフトウェアのカスタムハックをサポートするために、「小さな」デバイスドライバーを作成する必要がある場合があります。この目的のために、またいくつかの実際のドライバーをホストするために、Linuxカーネルはインターフェースをエクスポートして、モジュールが独自の小さなドライバーを登録できるようにします。その他のドライバーは、この目的のために設計されました。

わかりました。これから、単純なドライバー(この場合は単一のエントリポイント)があり、それがその他のドライバーであることがわかります。次に、別のソースであるEssential Linux DeviceDriversは次のように述べています。

その他(またはその他)のドライバーは、特定の共通の特性を共有する単純なcharドライバーです。その他のドライバーはcharドライバーであるため、charドライバーのエントリポイントに関する以前の説明は、その他のドライバーにも当てはまります。

これは、その他のドライバー単なるcharドライバーであると言っているようですが、おそらく関数のサブセットであり、charドライバーは複数のエントリポイントを持つことができます( ioctl()またはopen()またはread()呼び出しとして)

では、Linux Cのコーディング用語では、charとmiscデバイスドライバーの違いは何ですか? (すべてのその他のドライバーの明らかなメジャー番号の割り当て(10)に加えて)。サポートされているエントリポイントに違いはありますか?その他のデバイスドライバーには、完全なcharデバイスドライバーで取得できるもののサブセットしかないという私の仮定は正しいですか?

17
Mike

編集drivers/miscドライバーについて話していると思いましたが、misc_registerを使用してキャラクタードライバーを参照しているようです(およびdrivers/char/misc.cのすべてのAPI)。質問でこれを指定する必要があります。

この場合、misc AP​​Iを使用すると、小さな文字ドライバーを作成していて、たとえば1つのマイナー番号のみを使用するために新しいメジャー番号を割り当てる必要がない場合に作業が楽になるようです。それは物事を単純化しますが、すべてのファイル操作はstruct miscdevicefopsメンバーを使用して引き続き利用できます。基本的な違いは、miscデバイスごとに1つのマイナー番号しか取得できないことです。

私の以前の無関係な答えは、記録のために:

drivers/misc をざっと見てください:そこには「miscコア」はありません。つまり、miscはデバイスクラスではありません。それは他のどのカテゴリーにも当てはまらないドライバーの集まりです。気圧計、DAC、テストスイート、その他の奇妙なものなど。

drivers/misc/Kconfigの上部を見てください:

#
# Misc strange devices
#

menu "Misc devices"

このKconfigのすべてのアイテムは、「miscコア」ではなく、他のコア(i2cpci)に依存します。 、ttyなど)。通常、ドライバーが実際にドライバーコアを使用している場合は、Kconfigに表示されます。たとえば、ほとんどすべてのledsドライバー(drivers/leds)はledsクラスコアに依存しており、これは Kconfigノード にあります。

depends on LEDS_CLASS

たぶんmiscドライバーはすべてキャラクタードライバーです(私はそれらすべてをチェックしませんでした)が、おそらくそこにあるとはいえ、他の何かがまだ動作します間違った場所。多くのmiscドライバーをより良い場所に移動できるようになったと思います...ベテランのカーネルハッカーがこれを確認できます。

したがって、あなたの質問に答えるには:miscドライバー文字ドライバーである必要はないので、2つのカテゴリーは完全に無関係です。 miscドライバーは特別なものではないため、miscドライバーは文字ドライバーにすぎません。

UpdateHoneywellコンパスドライバー は良い例です。それは小さくて簡単です。

I²Cを使用して実際のコンパスと通信します。このデバイスはキャラクターデバイスとして表示されないため、メジャー番号10を忘れてください。ただし、すべてのI²Cデバイスと同様に、Sysfsの/sys/bus/i2c/devicesの下のどこかに表示されます。また、heading0_inputのように、グループに追加されたSysfs属性が表示され、読み取られたときに現在のコンパスの方向が表示されます。

これで、文字ドライバーではないmiscドライバーができました。

16
eepp

これは、その他のドライバーが単なるcharドライバーであると言っているようですが、おそらく関数のサブセットであり、charドライバーは複数のエントリポイントを持つことができます(ioctl()、open()、read()呼び出しなど)

はい、それはCharaterドライバーだけであり、Miscドライバーにも複数のエントリポイントread()、write()、ioctl()があります(miscdeviceの構造にはすでにfilefile_operations構造があるため)

私の理解では、小さなドライバーを作成する必要がある場合(1つ以上のエントリポイント(2,3、...エントリポイント)<<<は小さなドライバーを意味します)は、その他のドライバーを使用する必要があります。新しいメジャー番号を登録すると、RAMの無駄を防ぐことができます。

現在、カーネルはデバイスドライバーの静的テーブルを保持しているため、メジャー番号の軽薄な割り当てはRAMをかなり浪費します。したがって、Linuxカーネルは、単一のエントリポイントを登録する単純なドライバ用の簡略化されたインターフェイスを提供します。一般に、メジャー番号の名前空間全体をすべてのデバイスに割り当てることは有益であることに注意してください。これにより、カーネル自体にオーバーヘッドを発生させることなく、複数の端末、複数のシリアルポート、および複数のディスクパーティションを処理できます。単一のドライバーがそれらすべてを処理し、マイナー番号を使用して区別します。

4
Thi Nguyen