3

読み取り/書き込みのためにファイルを開く際の私の理解は次のとおりです。

アプリケーション層では、fopen()関数を呼び出すことができます。

関数はfwrite()システム コールを呼び出しますopen()

OS がopen()呼び出しを受け取ると、コマンドが VFS (仮想ファイル システム) に渡されます。

VFS は、必要なディレクトリを含むファイル名を検索し、必要なアクセス チェックを行います。

これが RAM キャッシュにある場合、ディスク アクセスは必要ありません。そうでない場合、VFS は、おそらく EXT4 である特定のファイル システムに読み取り要求を送信します。

次に、EXT4 ファイル システム ドライバーは、そのディレクトリが配置されているディスク ブロックを特定します。次に、読み取りコマンドをディスク デバイス ドライバーに送信します。


それでは、ボードに接続されたi2c デバイス Aを読み取りたいとしましょう。ファイルディレクトリは/dev/i2c/A です

  • すべてのデバイスにメジャー番号はありますか? たとえば、Linux OS は USB のメジャー番号として 180 を設定します。デバイス側では、各 USB デバイスにメジャー番号 180 はありますか?

  • 最初の質問に対する答えが「いいえ」の場合、Linux OS はデバイス A のタイプをどのように判断できますか?それは単にファイル ディレクトリによるものですか?

  • おそらく2番目の質問への答えだと思います:ブート初期化段階で、export()のようなものを使用してそのポートをファイルシステムにすでにマウントしている特定のコードがいくつかありますか?実際には、起動段階の直後に、ファイルディレクトリ/dev/i2c/Aがそこに存在し、i2c デバイスのメジャー番号がバインドされています。そのため、dev/i2c/A を開きたい場合、OS は SPI または USB ドライバーではなく、適切な i2c ドライバーを見つけます。この部分についてはよくわかりません。これに関する詳細情報が必要です。

  • 上記の状況は、起動段階の直後にデバイスがファイル システムにマウントされたときに発生します。USB を使用している場合、この USB をプラグインした後、正しいメジャー番号 180 でファイル システムにマウントするにはどうすればよいでしょうか。そして、マウント段階が始まる前にUSBが差し込まれたときにirqがあると思いますか?

4

2 に答える 2

8

参照: hotplug doc。サンプル コードを実行するとnetlink、デバイスが に追加/削除されたときにイベントが送信されることがわかりますUSB。これはドライバー モデルの一部です。各ドライバーはBUS;に接続する必要があります。これは、、、、、などです。同様に、 には、platform特定USBのデバイスを識別するためのエントリがあります。多くの場合、アドレスは特定のクライアント/スレーブ チップを識別するために使用できます。ドライバー モデルは、サスペンド、レジューム、順序付きシャットダウンなども容易にします。 I2CSPIPCIsysfsI2C

のファイルはまたはユーザー空間プログラム/dev/によって作成されます。名前をデバイス ノード (メジャー、マイナー、文字/ブロック) に関連付けます。および/またはスクリプトを使用して、情報に基づいて必要なデバイス名を作成できます。そのほとんどはスクリプトで使用できます。udevmdevsysfsudevnetlinkudev

編集:i2cバスマスタードライバーの場合、 Note 1 を実行してデバイスのアドレスを検出しprobeます。デバイスは、テーブルを使用して特定のドライバーに関連付けられます。たとえば、スターゲート マシン ファイルには、アドレスをドライバーimote2_i2c_board_infoに関連付けるファイルがあります。i2cデバイスについても同様の表がありSPIます。Platform注 2デバイスは で追加されplatform_add_devices()ます。 USBデバイスは、デバイスのPCI同様BUSの特定の ID によって識別されます。通常、マシン ファイル (最近ではdevice tree) が 2 つを関連付けます。
関連項目: Linux Journal - I2C Drivers pt1Linux Journal - I2C Drivers pt2

混乱の原因は、すべてのドライバー/デバイスが/dev/ディレクトリに表示されるものであることだと思います。本当じゃない。トップレベルのドライバーのみがユーザーに表示されます。多くの Linux ドライバー/デバイスは、マスターデバイスによって使用されます。デバイスの階層を形成できます。通常、最上位のデバイスのみがユーザーに公開されます。などの機能がありspi_write()、上位レベルのドライバーが を介して会話するために使用できますがSPISPIデバイスは にさらされていませんuser space。サウンドおよびメディア/テレビ キャプチャ カードはSPIデバイスを使用することがよくありますが、ユーザーはこれを認識していません。BUS存在し、使用されています。多くの場合、複数のカード ベンダーが同じチップ セットを使用します。すべてのカードのドライバーを作成する代わりに、カード用の接着剤のみを作成します。次に、chipドライバーの一般的なコレクションを接着剤で使用して、すべてを階層の最上位に結び付けます。これは、に公開されている最上位のドライバーですuser space。これにより、スマートTMチップ ベンダーは、システム インテグレーターが使用できる優れたドライバーを作成することもできます。

注 1:プローブi2cとはI2C、バス上に登録されているすべてのアドレスを要求するメッセージを意味します。プローブが正しいi2c命名法であるかどうかはわかりません。

注 2 PlatformデバイスはSOCデバイスです。関連する BUS がないため、プラットフォームは包括的なものです。通常、platformデバイスは CPU と統合されています (SOC はシステム オン チップの略です)。

于 2013-02-20T23:28:27.830 に答える
1

すべてのデバイスには、メジャー番号とマイナー番号があります。ls -n /dev ディスクなどの一部のドライバーでは、メジャー番号がハードコードされています。 他の人にとっては、それは動的です。デバイスは起動時だけでなく、実行時に検出されるため、マイナー番号を動的に割り当てることができます。カーネルは、dev 番号を正しいドライバーにマップする内部デバイス スイッチ テーブルを維持します。

于 2013-02-20T05:14:30.403 に答える