5

私は初心者です。デバイスドライバーに関連するメジャー番号とマイナー番号について、いくつかのアイデアがあります。また、Linux システムに接続できるほとんどのデバイスにはメジャー番号があることも知っています。そして、このメジャー番号に基づいて、対応するドライバーがロードされます。私はこの疑問を持っています。プラグインされたときに、カーネルがデバイスからメジャー番号を読み取る方法を教えてください。デバイスのプラグインからドライバーのロードまでの手順をできるだけ簡単に説明してください。

前もって感謝します。

4

2 に答える 2

18

メジャー/マイナー番号は、ブロックデバイスとキャラクターデバイス用です。

デバイスからメジャー番号を検出しません。USB デバイスはデバイス番号を通信でき、Linux はそれらを使用すると考えているかもしれませんが、USB ベンダー/製品 ID はメジャー番号とは関係ありません。まったく馬鹿げたシリアル デバイスをシリアル ポートに接続するとどうなるでしょうか。カーネルは、あなたが何かを差し込んだり抜いたりしたことを知る方法がありません。

したがって、たとえば、キャラクターデバイスのメジャー番号が必要な場合は、次のいずれかを使用します

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);

NKamrath が言ったように、または絶対的なものを使用します。ただし、多くは予約されていることに注意してください。

私の知る限り、あなたが求めている手順は次のとおりです。

  1. 一部のブロック/文字デバイスを一部のバスに接続します。
  2. バス (USB、PCI、PCI Express、SCSI、I²C など) に応じて、バスは (おそらく)いつの日か CPU に到達する割り込み信号を送信し、Linux に到達します。
  3. 割り込みルーチンは、バスの種類とその内部メカニズムを認識して、このデバイスに適切なドライバーをロードし(存在する場合は確実に)、その初期化関数を実行するために必要なジョブを実行します。
  4. デバイス ドライバの初期化関数register_chrdev_regionは、予約済みのメジャー番号が 1 つある場合は、メジャー番号を登録します (この有名な予約済みリストを参照してください)。それ以外の場合は、カーネルに割り当てを要求します (例: alloc_chrdev_region)。ドライバーは、このドライバー用にマイナー リージョンも予約します。
  5. ドライバーは、いくつかのコールバック (open/close/read/write) を設定し、それらをデバイス番号に関連付けるようにカーネルに要求します。

この時点で、デバイス番号を使用してドライバーと通信できますが、どのように? まだ何もあり/devません...それを行う1つの方法はmknod、通信したいもののメジャー/マイナーのペアがわかっている場合に使用することです。以下を発行します。

# mknod /dev/mydevice c 232 4

... つまり、メジャー 232 マイナー 4 の/dev/mydevice文字 ( ) デバイスにリンクされているデバイス ノードを作成してください。cそれらは絶対的なもの (予約済みリスト) である場合もあれば、ドライバーprintkが手動で行うことができるようになっている場合もあります。

しかし、ここにもっと良いことがあります。

引き続きデバイス ドライバーの初期化関数: ドライバーは、デバイスをSysfsデバイスとして登録します (「参考文献」を参照device_create)。これにより、デバイスが/sysツリーに配置され、そのノード (ディレクトリ) に というファイルが作成されueventます。もしそうならcat、それは次のようなものを出力します

MAJOR=232
MINOR=4
DEVNAME=whatever

それを試してみてください:

$ cat /sys/class/tty/console/uevent

合っているか

$ ls -l /dev/console

?

現在、udevは の管理を担当するユーザー空間プログラムです/dev。全体として、自動的/sysにデータを入力するためにツリーをスキャンするだけです。/dev次のように、すべてのキャラクター デバイスとブロック デバイスのメジャー/マイナーも表示される場合があります。

$ ls /sys/dev/char
$ ls /sys/dev/block

それはそれについてです。このすべてをよりよく理解したい場合は、ダミーのドライバーを開発し、それが自動的に に表示されるようにしてみてください/dev

于 2012-06-22T23:13:02.117 に答える
3

メジャー番号を事前に知っていれば、

int register_chrdev_region(dev_t first, unsigned int count);

カーネルがデバイスにメジャー番号を動的に割り当てることができるようにするには、

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, 
                    char *name);

メジャー番号を読むには

int MAJOR(dev_t dev);

デバイスまたはドライバーを挿入するには、コマンドを使用する必要がありますinsmod。次に、カーネルは、指定された番号を使用しようとするか、alloc関数を使用した場合は、空きメジャー番号を動的に割り当てます。カーネルとドライバーの設計の内部動作を適切に説明するには、多くの説明が必要です。ただし、 Linux Device Drivers 3rd Editionと呼ばれる、読みやすい(コードブック用の)すばらしい無料の本があります。これは、ドライバーの非常に優れた入門書であり、最初の3章(約100ページ)しか読んでいない場合でも役立ちます。あなたは私があなたが求めていると思うことをよく理解するでしょう。また、例のすべてのソースコードが利用可能であるため、デモをハックしてドライバーの作成をより迅速に開始できます。

于 2012-06-22T19:50:09.177 に答える