Linux で /dev と /proc/devices の出力がまったく異なる理由

Linux で /dev と /proc/devices の出力がまったく異なる理由

私の知る限りでは:

  • 1 つのドライバーは、1 つ以上の「デバイス」に関連付けることができます。

  • /dev ファイルの下にあるファイルはこれらのデバイスを表します。ドライバーにはメジャー番号があり、各デバイスにもマイナー番号があるため、(メジャー、マイナー) で 1 つのデバイスが識別されます。

  • /proc/devices にもデバイスがリストされます。

もし私が知っていることが真実ならば:

/dev と /proc/devices の出力がまったく異なるのはなぜですか? dev にはデバイス名、メジャー番号、マイナー番号があります。また、/proc/devices にはメジャー番号とデバイス名がありますが、マイナー番号はありません。なぜ、この 2 つのリストは同じメジャー番号であってもまったく異なる出力を示すのでしょうか?

たとえば、ls -l /devのこの行を見てください。

crw------- 1 root root     10, 235 Sep 19 21:40 autofs

これはメジャー番号 10、マイナー番号 235 のキャラクター デバイスです。デバイス名は autofs です。

ここで、/proc/devices 内の同じメジャー番号のエントリを確認します。

10 misc

ご覧のとおり、デバイス名はまったく異なり、マイナー番号はありません (メジャー番号のみでデバイスを識別する方法は?)。

いくつかの用語が混同されているようですが、解決できませんでした。

答え1

カーネルモジュール(「ドライバ」とも呼ばれる)は、次のようなルーチンとデバイスを識別する文字列を使用して、ブロックデバイスまたはキャラクタデバイス(従来のUNIXの意味で、「デバイス」には多くの意味があります)をカーネルにregister_blkdev登録できます。どれでもそのために文字列が作成され、これらの文字列が/proc/devicesファイル内に表示されます (これはカーネル テーブルの単なるテキスト表現です)。

一方、最近の Linux システムでは、ファイルはいくつかの複雑なルール/devに従って作成されますudev。これらのファイルは、読み取り、書き込み、ioctl を介してユーザー空間がカーネルと対話する方法を表すことになっています。これは、メジャー デバイス番号とマイナー デバイス番号を持つ「特別な」ファイルであるため機能し、これらのファイルへのアクセスはカーネル呼び出しに変換されます (大まかに言えば)。

これら 2 つとその構造はまったく無関係です。唯一の関連性は、そのような特殊ファイルにアクセスするたびに、そのファイルのメジャー デバイス番号が検索され、そのファイルを登録したモジュールを見つけるために使用されることです。登録された文字列はまったく無関係です。ユーザーが名前を知っている限り、ファイルが表示される名前もまったく無関係です。必要に応じて/dev/this-disk、ディスクをおよび/dev/that-diskではなく と と呼び、ルールを変更しても問題ありません。/dev/sda/dev/sdbudev

しかしもちろん人々は物事をシンプルにすることを好むため、デバイスを登録するために使用される文字列は、 に表示されるデフォルトの名前と同じか、少なくとも類似していることがよくあります/dev。しかし、それが唯一のつながりです。

関連情報