Linux システムにおけるデバイスの分類とその関連付け

Linux システム上の各デバイスには、操作に関する独自の固定ルールがあり、デバイスの種類やモデルは数多くあります。各デバイスの固定ルールをカーネルに書き込むことは現実的ではなく、意味もありません。

各デバイスには、システム上で適切に動作できるようにするための対応するドライバーがあります。小型の LED ライトから大型のネットワーク カードに至るまで、すべてのデバイスには関連するドライバーが必要です。ドライバーは、アプリケーション プログラムと実際のデバイスの間のソフトウェア層と見なされます。

アプリケーション プログラムは、まずドライバーに信号を送信してデバイスを制御します。次にドライバーは信号を受信し、対応するアクションを実行するようにデバイスに命令します。アプリケーション プログラムがデバイスによって収集されたデータを取得したい場合、それもドライバーを通じて行う必要があります。

Linuxにおけるデバイスの分類

Linux システムはデバイスを 3 つの基本タイプに分類し、各モジュールは通常、これらのクラスの 1 つとして実装されます。

01 キャラクターデバイス

キャラクターデバイスは、バイトのストリームとしてアクセスできるデバイスです。この機能は、キャラクター デバイス ドライバーによって実装されます。キャラクタ デバイス ドライバは通常、少なくともオープン、クローズ、読み取り、および書き込みシステム コールを実装します。

キャラクターデバイスはシーケンシャルアクセスであり、デバイスが応答した後にのみ対応する情報を読み取ることができます。ランダムにアクセスすることはできません。各キャラクタ デバイスには、メジャー デバイス番号とマイナー デバイス番号で構成されるデバイス番号があります。シリアル ポートや IIC などの一般的なキャラクタ デバイスです。

キャラクタ デバイスに対応するファイルは /dev ディレクトリにあり、各ファイルは 1 つのハードウェアに対応します。Linux システムの /dev ディレクトリで、ls -l を使用して詳細を表示します。最初の文字「c」はキャラクタ デバイス ファイルの識別子です。

Linux キャラクターデバイス

02 ブロックデバイス

キャラクター デバイスと同様に、ブロック デバイスには、/dev ディレクトリ内のファイル システム ノードを介してアクセスします。ファイル システムはブロック デバイスに収容できます。ディスク、emmc フラッシュ、NAND フラッシュ、SD カードなどの一般的なブロック デバイス。各ブロック デバイスも同様に r--+'/h vortex【5 スライス【デバイス番号、プライマリ デバイス番号とセカンダリ デバイス番号で構成されます】】を持ちます。番号。Linux システム上の /dev ディレクトリの詳細を表示するには、コマンド ls -l を使用します。最初の文字「b」はブロックデバイスファイルを識別します。/dev dev の下の各ブロック デバイス ファイルは、ディスクのパーティションに対応します。

ネットワーク機器

03 ネットワーク機器

ネットワーク関連のトランザクションはすべて、他のホストとデータを交換できるデバイスであるネットワーク インターフェイスを経由します。通常、インターフェイスはハードウェア デバイスですが、純粋にソフトウェア デバイスにすることもできます。たとえば、ifconfig には、ネットワーク インターフェイス (ネットワーク ループバック (ループバック) インターフェイス) に関する情報を表示するための LO があります。

ネットワーク インターフェイスにアクセスするには、eth0、eth1、lo などの一意の名前を割り当てます。ただし、この名前に対応するノードがファイル システムに存在しません。ネットワーク インターフェイスには、キャラクタ デバイスやブロック デバイスのようなデバイス番号はなく、eth0、eth1 などの一意の名前だけがあり、この名前はデバイス ファイル ノードに対応する必要はありません。

カーネルは、パケット転送に関連する一連の関数を使用してネットワーク デバイス ドライバーと通信します。これは、キャラクター デバイスやブロック デバイスの read() および write() メソッドとは異なります。

ネットワーク機器

さまざまなキャラクター デバイスとブロック デバイスはすべて、Linux の「すべてがファイルである」という設計思想を反映しています。ネットワーク デバイスは、この考えを反映していない唯一のデバイスです。

デバイス ノード、デバイス ドライバー、およびデバイスの関連付け

システム全体には多くのデバイスが搭載されています。デバイス ノードにアクセスするとき、システムはどのデバイス ドライバーを使用するか、どのデバイスにアクセスするかをどのように認識するのでしょうか? これはデバイス番号によって実現されます。

デバイスノードを作成するときは、メジャーデバイス番号とマイナーデバイス番号を指定する必要があります。デバイス ノードの場合、名前は重要ではなく、実際に対応するドライバーと対応するデバイスを指定するデバイス番号が最も重要です。

プライマリ デバイス番号は異なるタイプのデバイスを区別するために使用され、セカンダリ デバイス番号は同じタイプの複数のデバイスを区別するために使用されます。Linux では、一般的に使用されるデバイスについて、ハードディスクのマスター デバイス番号 3 など、合意された番号を持っています。

/dev ディレクトリでコマンド ls -l plus name を使用して、対応するプライマリ デバイス番号とセカンダリ デバイス番号を表示します。

デバイス ノード、デバイス ドライバー、およびデバイスの関連付け

主装置

ドライバーが初期化されると、ドライバーと対応するマスター デバイス番号がシステムに登録されるため、アプリケーションがデバイス ノードにアクセスするときに、システムはどのドライバーにアクセスしているかを認識できます。/proc/devices ファイルを通じてシステム デバイスのマスター デバイス番号を駆動できます。

Linux メインデバイス

マイナー機器番号

ドライバーが実行されると、駆動できることが判明したデバイスごとにデバイス オブジェクトが作成され、異なるデバイスを区別するためにマイナー デバイス番号が割り当てられます。そのため、アプリケーションがデバイス ノードにアクセスするとき、ドライバーはマイナー番号に基づいてアクセスしているデバイスを認識します。

元は www.forlinx.net で公開されています。

www.forlinx.net