ARM ベースのボードで一般的な DMA トランザクションに関与するいくつかのコンポーネント (ソフトウェアとハードウェアを含む) についてある程度の知識を集めましたが、完全に統合されている方法がわかりません。完全な一貫性が見つかりませんでした。これについての説明。
私がすでに持っている高レベルの知識を書き留めます。誰かが私が間違っているところを修正し、不足している部分を完成させて、全体像が明確になることを願っています. 私の説明は、ユーザー空間のソフトウェアから始まり、ハードウェア コンポーネントにまで掘り下げます。誤解されている部分はイタリック太字で示しています。
- ユーザー モード アプリケーションは、デバイスからの読み取り/書き込みを要求します。つまり、I/O 操作を行います。
- オペレーティング システムは要求を受け取り、それを適切なドライバーに渡します (すべての OS には、これを行うための独自のメカニズムがあります。ここでさらにドリルダウンする必要はありませんが、ここで洞察を共有したい場合は大歓迎です)。
- I/O 要求を処理するために担当しているドライバーは、デバイスがマップされているアドレスを知っている必要があります (私は ARM ベースのボードに興味があるので、メモリにマップされた I/O しかなく、ポートはありません) I/O)。ほとんどの場合 (スマートフォンのようなボードを考える場合)、ブート時にブートローダーから提供されるデバイス ツリーからデバイス アドレスを解析する Linux カーネルが存在するか (最新のアプローチ)、または Linux がプリコンパイルされています。特定のモデル ファミリとデバイス アドレスを含むボード (ソース コードにハードコードされている) (古くて廃止された? アプローチ)。場合によっては (スマートフォンでよく発生します)、ドライバーの一部がプリコンパイルされ、カーネルにパッケージ化されているだけです。つまり、ソースがクローズされているため、デバイスに対応するアドレスが不明です。それが正しいか?
- ドライバーが通信したいデバイスの関連レジスタのアドレスを知っている場合、ドライバーは、デバイスが (DMA の助けを借りて) データを書き込むバッファー (通常はカーネル空間内) を割り当てます。ドライバーはそのバッファーの場所をデバイスに通知する必要がありますが、デバイスが (メモリを操作するために) 操作するアドレスは、ドライバー (CPU) が操作するアドレスとは異なるため、ドライバーはデバイスに通知する必要があります。割り当てたばかりのバッファの「バスアドレス」について。ドライバーはそのアドレスをデバイスにどのように通知しますか? IOMMU の使用はどのくらい一般的ですか? IOMMU を使用する場合、アドレス指定を管理するハードウェア コンポーネントは 1 つですか、それともデバイスごとに 1 つですか?
- 次に、ドライバーはデバイスにジョブを実行するように命令し (レジスターを操作して)、デバイスは出力データをメモリ内の割り当てられたバッファーに直接転送します。ここで、device-driver:bus:bus-controller:actual-device の関係と少し混乱しています。たとえば、I2C プロトコルで通信することを認識している架空のデバイスを考えてみましょう。SoC は I2C バス インターフェイスを指定します - これは実際には何ですか? I2C バスにはある種のバス コントローラがありますか? CPU は I2C バス インターフェイスと通信しますか、それともデバイスと直接通信しますか? (つまり、I2C バス インターフェイスはシームレスです)。デバイスドライバーの経験がある人なら、これに簡単に答えることができると思います..
- デバイスは DMA チャネルを設定します。デバイスはメモリに直接接続されているのではなく、何らかのバスを介して (バスをマスターする) DMA コントローラに接続されているため、DMA と対話して、必要なデータをメモリ内の割り当てられたバッファに転送します。ボード ベンダーが ARM IP コアとバス仕様を使用する場合、このステップには、AMBA 仕様 (つまり、AHB/マルチ AHB/AXI) のバスを介したトランザクションと、デバイスとその上の DMAC 間の何らかのプロトコルが含まれます。このステップについて詳しく知りたいのですが、実際にはどうなりますか? ARM社のDMAコントローラには多くの仕様がありますが、どの仕様が主流ですか? どれが時代遅れですか?
- デバイスが完了すると、割り込みが送信され、割り込みコントローラーを介して OS に渡されます。OS の割り込みハンドラーは、DMA 転送が完了したことを認識している適切なドライバーに割り込みを指示します。