以下からのLinuxプログラミングインタフェース、14.1
各デバイスファイルには、メジャーID番号とマイナーID番号があります。メジャーIDはデバイスの一般的なクラスを識別し、このタイプのデバイスに適したドライバーを検索するためにカーネルによって使用されます。マイナーIDは、一般クラス内の特定のデバイスを一意に識別します。デバイスファイルのメジャーIDとマイナーIDは、ls -lコマンドで表示されます。
[...]
各デバイスドライバーは、特定のメジャーデバイスIDとの関連付けを登録します。この関連付けにより、デバイススペシャルファイルとデバイス間の接続が提供されます。カーネルがデバイスドライバーを探す場合、デバイスファイルの名前は関係ありません。
この古い(2001)Linux Device Drivers(2e)の章も参照してください。
つまり、デバイスのタイプごとにメジャー:マイナーからデバイス:インスタンスへの一意のマッピングを提供することを意図しています。厳密には、メジャーが同じである2つの異なるデバイスを使用できます。1つがcharで、もう1つはblockである限り、マイナーです。
# ls -l /dev/ram1 /dev/mem
crw-r----- 1 root kmem 1, 1 Jan 1 1970 /dev/mem
brw-rw---- 1 root disk 1, 1 Jan 1 1970 /dev/ram1
Linuxでは、1つのシステムの任意の時点で、デバイスのタイプごとにメジャー:マイナー番号が一意です。ただし、数値は時間の経過とともに変化する可能性があり、異なるLinuxシステム間で同じである必要はありません(同じディストリビューション、カーネル、ハードウェアでも)。文字デバイスとブロックデバイスには異なる番号付けスペースがあることに注意してください。たとえば、ブロックメジャー1はRAMディスクに割り当てられ、文字メジャー1はヌルとゼロを含むカーネルデバイスのセットに割り当てられます。
歴史的には、デバイスメジャーは(主に)レジストリを介して静的に割り当てられていました(メンテナンスされていませんが、カーネルソースにも存在しますDocumentation/devices.txt
)。最近、多くのデバイスが動的に割り当てられ、これはudevによって管理され、マッピングはで表示でき/proc/devices
ます。固定デバイスはまだ存在しますincude/uapi/linux/major.h
(最近から移動されましたinclude/major.h
)
ここで、major:minorの組み合わせは特定のデバイスインスタンスを一意に識別しますが、同じデバイスを参照する複数のデバイスノード(ファイル)の作成を妨げるものは何もありません。で作成する必要はありません/dev
(ただし、デバイスノードの作成をサポートするファイルシステム上にある必要があり、nodev
オプションでマウントされていません)。
一般的な使用法は、chrootで重複するゼロ、null、ランダムデバイスを作成することです。
# find /dev /var/chroot -regextype posix-extended -regex ".*/(zero|null|random)" -type c |
xargs ls -l
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /dev/zero
crwxrwxrwx 1 root root 1, 3 2012-11-21 03:22 /var/chroot/sendmail/dev/null
crw-rw-r-- 1 root root 1, 8 2012-05-07 10:35 /var/chroot/sendmail/dev/random
crw-rw-rw- 1 root root 1, 5 2012-11-21 03:22 /var/chroot/sendmail/dev/zero
名前は単なるエイリアスであり、カーネルはほとんどの名前や場所をあまり気にせず、メジャー番号を気にして正しいドライバーを選択できるようにし、ドライバーは(通常)マイナー番号を気にして正しいインスタンス。
ほとんどの名前は単なる規則です(ただし、一部はPOSIXで定義されています)。1つのデバイスが、複数のメジャー番号を登録するチェックすることができることにも留意されたいsd
におけるドライバ/proc/devices
。ドライバモジュール名(.ko
)はデバイス名と同じである必要はなく、のデバイスノードと同じである必要もありません。/dev
単一のドライバモジュールで複数の論理/物理デバイスまたはデバイス名を管理できます。
要約すると:/dev/
同じメジャー:マイナー番号を持つ2つ以上のデバイスノード(またはその他の場所)がある場合がありますが、それらが同じタイプの場合、同じデバイスを参照します。複数のメジャーインスタンスを処理できる1つのドライバーを持つことができますが、カーネル内およびドライバー内では、タイプ(charまたはブロック)ごとに、major:minor番号が特定のデバイス(major)および特定のインスタンス(デバイスのマイナー)。
同じタイプとmajor:minorの2つのデバイスノードを使用して、2つの異なる論理デバイスまたは物理デバイスにアクセスすることはできません。デバイスがアクセスされているとき、カーネルはタイプとメジャー番号に基づいて(デバイスノード名に基づくのではなく) 1つのドライバーを選択します。慣例により、マイナー番号は特定のインスタンスまたはサブ機能を決定的に選択します。
更新
いくつかの興味深い歴史といくつかの* BSDの見方は、Poul-Henning Kampの2002 BSDConプレゼンテーションで見つけることができます:https :
//www.usenix.org/legacy/events/bsdcon/full_papers/kamp/kamp_html/
あなたがもし1978年までの時間に戻って飛躍(アルカテル・ルーセントの礼儀、ベルシステムテクニカルジャーナル 7月- 1978年8月)「Unixのタイムシェアリングシステム、それが明確に(p1937)」のセットをアウト:
デバイスは、メジャーデバイス番号、マイナーデバイス番号、およびクラス(ブロックまたは文字)によって特徴付けられます。クラスごとに、デバイスドライバーへのエントリポイントの配列があります。メジャーデバイス番号は、特定のデバイスドライバーのコードを呼び出すときに配列にインデックスを付けるために使用されます。マイナーデバイス番号は、引数としてデバイスドライバーに渡されます。マイナー番号は、ドライバーがマイナー番号に起因するもの以外に重要性はありません。通常、ドライバーはマイナー番号を使用して、いくつかの同一の物理デバイスの1つにアクセスします。