メジャー/マイナー番号は、ブロックデバイスとキャラクターデバイス用です。
デバイスからメジャー番号を検出しません。USB デバイスはデバイス番号を通信でき、Linux はそれらを使用すると考えているかもしれませんが、USB ベンダー/製品 ID はメジャー番号とは関係ありません。まったく馬鹿げたシリアル デバイスをシリアル ポートに接続するとどうなるでしょうか。カーネルは、あなたが何かを差し込んだり抜いたりしたことを知る方法がありません。
したがって、たとえば、キャラクターデバイスのメジャー番号が必要な場合は、次のいずれかを使用します
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
NKamrath が言ったように、または絶対的なものを使用します。ただし、多くは予約されていることに注意してください。
私の知る限り、あなたが求めている手順は次のとおりです。
- 一部のブロック/文字デバイスを一部のバスに接続します。
- バス (USB、PCI、PCI Express、SCSI、I²C など) に応じて、バスは (おそらく)いつの日か CPU に到達する割り込み信号を送信し、Linux に到達します。
- 割り込みルーチンは、バスの種類とその内部メカニズムを認識して、このデバイスに適切なドライバーをロードし(存在する場合は確実に)、その初期化関数を実行するために必要なジョブを実行します。
- デバイス ドライバの初期化関数
register_chrdev_region
は、予約済みのメジャー番号が 1 つある場合は、メジャー番号を登録します (この有名な予約済みリストを参照してください)。それ以外の場合は、カーネルに割り当てを要求します (例: alloc_chrdev_region
)。ドライバーは、このドライバー用にマイナー リージョンも予約します。
- ドライバーは、いくつかのコールバック (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
。