web-dev-qa-db-ja.com

dmaと割り込み駆動型I / O

DMAと割り込みI/Oの違いについては少しわかりません(現在、オペレーティングシステムの概念、第7版を読んでいます)。

具体的には、どちらの場合でも割り込みがいつ発生するかはわかりません。どちらの場合でも、CPUは他の作業を自由に実行できます。私が読んでいるものですが、必ずしも調整することはできません:

割り込み駆動型

  1. ドライバーを介して初期化されたコントローラー
  2. コントローラは、アクションを決定するために、ドライバによってロードされたレジスタを調べます
  3. 周辺機器およびコントローラのバッファとの間のデータ転送が行われます。
  4. コントローラは、(各バイトの読み取り時?各ワードの読み取り時?バッファがいっぱいになったとき?転送が完了したとき?
  5. 両方ペリフェラル<->コントローラーI/Oが実行され、コントローラー<-> MM I/Oが実行されている間、CPUは何も実行していないと理解しています。
  6. 転送が完了したとき、またはブロックがいっぱいになったとき、CPUはコントローラーバッファーからMMへの転送を初期化する必要があります

[〜#〜] dma [〜#〜]

  1. 上記と同じですが、コントローラーがCPUの介入なしに、バッファーからMMに直接データを転送できる点が異なります。
  2. これは、転送全体が完了したときにのみCPUが中断されることを意味しますか、それともコントローラーバッファーがいっぱいになったときにCPUが中断されることを意味しますか?
  3. CPUがコントローラー<-> MM I/Oを待機する必要がなくなったが、コントローラーのバッファーがいっぱいになったときに中断する必要があるという唯一の違いはありますか?または、DMAはCPUからもそれを隠しますか?
11
Joney

DMAと割り込みI/Oの違いが少しわかりません

DMAと割り込みの違いは、反対の概念ではないため、偽物です。
DMAと割り込みは直交する概念であり、通常、両方の概念が一緒に使用されます。

DMAの代わりに、プログラムドI/O、別名PIOがあります。
割り込みの代わりにポーリングがあります。

割り込み駆動

あなたはあなたが言及しているものにもっと具体的にする必要があります。
システムが割り込みを使用していない場合は、ポーリングを使用してデバイスのステータスの変化を検出する必要があります。

PIOは、多くの場合、(デバイスからの)割り込みを使用して、各バイト/ワードデータ転送を開始します。これは、PIOのCPUを集中的に使用する性質を軽減するのに役立ちます。ポーリングされたPIO転送は、そうでなければCPUリソースを完全に消費します。
しかし、「割り込みのあるPIO」を単に「割り込み」または「割り込み駆動型」と呼ぶのは不正確で誤解を招く恐れがあります。

DMA転送は、ほとんどの場合、(DMAコントローラーからの)completion interruptを使用して、バッファー転送が完了したことをCPUに通知します。
(完了割り込みを使用する代わりに)DMA完了をポーリングすると、DMAが軽減するはずのCPUに負担がかかります。 DMA転送を開始し、完了のためにポーリングするブートローダーを見たことがあります。ただし、これはビジーウェイトを許容できる単一のタスク環境ですが、オペレーティングシステムはCPUの可用性を最大化する必要があります。つまり、完了割り込みでDMAを使用することを意味します。

特定のコンテキストを提供せずに「中断」について話し合う。これらの割り込みが生成される原因と理由は、おそらく混乱の原因です。

  1. ドライバーを介して初期化されたコントローラー
  2. コントローラは、アクションを決定するために、ドライバによってロードされたレジスタを調べます
  3. 周辺機器およびコントローラのバッファとの間のデータ転送が行われます。
  4. コントローラは、(各バイトの読み取り時?各ワードの読み取り時?バッファがいっぱいになったとき?転送が完了したとき?
  5. 周辺機器<->コントローラーI/Oとコントローラー<-> MM I/Oの両方が実行されている間、CPUは何も実行していないと理解しています。
  6. 転送が完了したとき、またはブロックがいっぱいになったとき、CPUはコントローラーバッファーからMMへの転送を初期化する必要があります

あなたの質問で私が見る問題は、あなたが曖昧な構成を提起しているということです。
「周辺機器」、「コントローラー」、CPU、「MM」(おそらくメインメモリ?)についておっしゃっています。

ソフトウェアの観点から、周辺機器接続は次のトポロジのいずれかになります。

A. CPU <->デバイス

B. CPU <->コントローラーデバイスまたはメディア]

C. CPU <->バス-デバイス
D。 CPU <->バス-コントローラー-[デバイスまたはメディア]

接続Aは、シリアルポートのローカルUARTなど、CPUが直接アクセスできるデバイスの典型です。ハードウェアの実装に関係するバスがあるかもしれませんが、それらはソフトウェアには見えません。

接続Bは、デバイスコントローラーを介してCPUに接続するデバイスの典型です。マルチメディアカード(MMC)コントローラーからSDカードおよびIDE(統合ディスクコントローラー)ディスクドライブ。 Aとは異なり、CPUはデバイスコントローラーとのみインターフェイスする必要があり、デバイス自体とはインターフェイスしません。コントローラとそのデバイス間の相互作用は、通常、CPUによって制御されず、最小限の監視(あるとしても)されます。コントローラは、CPUとそのデバイス間のインターフェイスを簡素化するために存在します。

接続CおよびDは、CPUがバス(USB、SPIまたはSATAなど)を介して間接的にアクセスできるデバイスまたはそのコントローラー(USB-イーサネットアダプターやSPIなど)を表します。 _ NORフラッシュ。デバイスまたはそのコントローラーへのコマンドは、バスを介して送信する必要があります。たとえば、ディスクコントローラへのATAPIコマンドは、SATAコントローラを介して送信する必要があります。 Aとは異なり、バスコントローラはCPUが直接I/Oを実行する必要があるインターフェイスです。

したがって、#3と#5aは無関係です。 CPUは関与していません。また、コントローラとデバイスのインターフェイスについて一般化することはできません。これは、周辺サブシステムごとに一意である可能性があるためです。 1つのコントローラーは1バイトをバッファリングするだけですが、別のコントローラーはECCを検証するためにブロック全体をバッファリングします。

DMA

  1. 上記と同じですが、コントローラーがCPUの介入なしに、バッファーからMMに直接データを転送できる点が異なります。

  2. これは、転送全体が完了したときにのみCPUが中断されることを意味しますか、それともコントローラーバッファーがいっぱいになったときにCPUが中断されることを意味しますか?

  3. CPUがコントローラー<-> MM I/Oを待機する必要がなくなったが、コントローラーのバッファーがいっぱいになったときに中断する必要があるという唯一の違いはありますか?それともDMAはそれをCPUからも隠しますか?

これらのシナリオと質問はほとんど意味がありません。転送の方向は指定されていません。つまり、CPUが読み取りまたは書き込み操作を実行します)。

DMA転送は、ほとんどの場合、(DMAコントローラーからの)completion interruptを使用して、バッファー転送が完了したことをCPUに通知します。

このデータのソースを指定せずに、フレーズ--- ["コントローラーバッファーがいっぱいになったとき"を繰り返し使用します。デバイスからコントローラーへのI/Oについて質問している場合、そのようなI/Oは通常CPUにとって最小限の懸念事項であり、ステータスの表示はコントローラー固有です。

あなたはブロックタイプの転送について質問しているようです。ブロック転送を理解しても、必ずしも文字ベースのI/Oを理解できるとは限りません。
文字ベース(UART)I/Oに関する派生的な質問については、 割り込みベースのマスターUART IO を参照してください。

12
sawdust

割り込み駆動型IOの場合、MCUは各バイトまたはワードで割り込みを取得します。これは、マイクロコントローラーが促進するものによって異なります。 MCUは割り込みモードに移行し、バイト/ワード受信ごとに通常の動作モードを終了します。ここでは、MCUはIOからデータを読み取り、メモリにコピーする以外に何もできません。

DMA DMAの場合、割り込みの場合にMCUによって実行されるのと同じことを実行します。したがって、ここでは、MCUは他のことを自由に実行できます。構成できます。 DMA割り込みが必要なバイト数について。したがって、ここではIO割り込みとは異なります。これは、MCUがすべてのバイトまたはワードに対して割り込みを取得するわけではないためです。代わりに取得します。 DMAは、構成した量のデータを受信した場合のみ)から割り込みます。さらに、DMAは、IO to RAMなので、MCUもコピーに労力を費やす必要がないため、大幅な時間の節約になります。

したがって、1 KBのデータで割り込みを行うようにDMAを構成した場合、MCUは1 Kバイトに対して1つの割り込みを取得します。それ以外の場合、割り込み駆動型IOを使用すると、1Kの割り込みを取得します。 of DMAは、割り込み駆動型IOと比較して、割り込みの数を減らし、パフォーマンスを向上させています。

そのため、DMAは、大量のデータを頻繁に転送する必要がある場合に主に使用されます。

3
Vicky

ご理解のほど簡単な言葉でお伝えします。

ダイレクトメモリアクセスの略であるDMAは、コンピュータのハードウェアコンポーネントがメモリバスにアクセスし、転送を制御するシステムです。たとえば、CD/DVDドライブは通常DMAを使用して動作します。ただし、CPUは常にすべてのマスターであることに注意してください。つまり、CPUがDMAコントローラーにマスターシップを与えたとしても、DMAをチェックする能力があります。バス制御を再度呼び出すことができます。いつでもDMAのタスクを実行できます。CPUからのバスの制御をDMAおよびDMA)に設定するために使用されるレジスタがあります。 DMAコントローラーが完了すると、CPUに割り込んだり、ジョブが終了したことを通知したりする場合があります。これがDMAについてです。

割り込みI/Oになりました。割り込みI/OはDMAよりもはるかに頻繁です。通常、プロセスはI/Oを何度も実行します。ユーザーからの入力を求めることは、割り込みI/Oになります。 DMAではありません。割り込みには2つのタイプがあります。

  1. ソフトウェア割り込み
  2. ハードウェア割り込み

各割り込みには特別な番号が割り当てられています。そして、各割り込みは、あなたのRAM内のどこかに保存され、割り込み番号で構成されるテーブルから呼び出される割り込みルーチン(単純な関数)によって処理されます。私はあなたのためにこれを伝えています理解。マウスを動かしたり、キーボードで入力したりすると、実際には割り込みが発生します。

3
user3815757