デバイスドライバをはじめ、デバイスにかかわるお困りごとの際はお気軽にお問い合わせください。
【 デバドラ講座7 : 割り込みとDMA転送 】
1.割り込み
CPUが通常の処理を行っている時に、デバイスがCPUに電気信号を送り、割り込んでCPUに処理要求をしたとします。すると、CPUはデバイスから要求された処理を割り込んで先に行い、割り込み処理が終了すると通常の処理に戻ります。このことを割り込みと言います。通常、割り込みはデバイスの状態通知の手段として使われます。
実際に割り込みが行われたときCPUがどのような動きをするのか図1で説明します。上から下に時間が流れており、縦のラインがCPUの処理を行っている状態を示しています。向かって一番右側のラインでCPUが通常の処理を行っています。青のデバイスが信号を送り、CPUに処理の要求をしました。すると、CPUはそれまで行っていた処理を中断し、デバイスに要求された処理を行います。デバイスから要求された処理が終了すると、それまで行っていた通常の処理を続行します。デバイスからの信号が要求ではなく、エラー通知の場合も処理の手順は同じです。デバイスでエラーが発生したという情報を受け取ると、CPUは行っていた処理を中断してユーザーにエラーの通知を行い、通常の処理に戻ります。
複数の割り込みが同時に行われたとします。この場合に備え、割り込みには優先順位が最初から決められており、CPUは優先順位の高い方から処理を行っていきます。図1で青と黄のデバイスの割り込みは同時に発生しています。ここで、黄のデバイスの優先順位が高いので、CPUは黄のデバイスからの要求を先に行い、次に青からの要求、そして通常の処理を行います。また、割り込みは短時間で処理されます。
割り込みは割り込みハンドラと呼ばれる小さなプログラムコードで実行されます。割り込みハンドラのアドレスは割り込みベクタと呼ばれるメモリ領域に保存されています。CPUは割り込みベクタから適当なハンドラのアドレスを探し出し、それを実行します。なお、割り込みベクタのメモリ領域はシステムが起動した時に確保されます。
割り込みはハードウェアとソフトウェアによって禁止、許可の操作を行うことができます。割り込みを使わないデバイスはポーリングによりデバイスの状態を管理します。ポーリングとはデバイスが正常に作動しているか、新たな要求がないか、をCPUが定期的にチェックすることを指します。チェックを行いCPUが処理を行う必要があれば、行います。ポーリングの頻度はデバイスによって様々で、その情報はドライバに収められています。
2.DMA転送
デバイスとメインメモリ間の情報の転送を、CPUを経由せずに行うことをDMA転送(Direct Memory Access)と言います。CPUは転送を行いなさいという命令を一度行うと、その後は関与しません。一回の操作で大量のデータを転送できるので、サウンドカードやネットワークカード等の高速デバイスはDMA転送を行います。DMA転送ではデバイスメモリとメインメモリ間の双方のデータ通信ができます。デバイスレジスタやデバイスメモリと違い、DMA転送はシステム上の空間を使うのではなく、実際にメモリを使用します。一回でDMA転送できるバイト数は、デバイスとCPUの仕様で決められています。
DMA転送はDMAコントローラというハードウェアコンポーネントによって行われます。デバイスドライバは転送の条件のみを与え、具体的なデータ転送には関与しません。DMAコントローラが存在する位置によってシステムDMAとバスマスタDMAに分けられます。
システムDMAはマザーボードにDMAコントローラが存在します。フロッピーディスクドライブ等の昔からのドライバはこの機能を利用していますが、新しいドライバではほとんど利用されていません。システムDMAは8つの通信路(チャネル)を保有しています。複数のデバイスが1つのチャネルを共有することは許可されていますが、1つのチャネルで複数のDMA転送を同時に行うことができません。システムDMAではチャネルが使用されている時、同じチャネルを利用するにはそのチャネルが自由になるまで待機しなければなりません。もう片方のバスマスタDMAは、デバイス自身にDMAコントローラが存在しており、システムDMAのように待機する必要がありません。バスマスタDMAはアーキテクチャ、複雑性の両面で多様化が進んでいます。
デバイスのハードウェアの機能でパケットDMAとコモンDMAの2種類のデバイスに分けられます。パケットDMAはバスマスタDMAの一般的に使用されている形式です。パケットDMAはデバイスからメモリ、メモリからデバイスの転送方向で、それぞれ違う論理アドレスを使い転送を行います。コモンDMAはすべての転送において同じバッファを使います。DMA転送を行うデバイスドライバは、ハードウェア仕様とシステム構造に深く関わりがあるので、それらをよく理解した上で開発を行う必要があります。
参考資料
- IT用語辞書「割り込みハンドラとは」
- http://e-words.jp/w/E589B2E3828AE8BEBCE381BFE3838FE383B3E38389E383A9.html
- 「NTドライバプログラミング」
- Peter G. Viscarola、W. Anthony Mason著 久保雅俊、三浦秀朗訳 サイエンスパーク株式会社 監修
- 「Windows NTデバイスドライバプログラミング」
- アート・ベーカー著 WinProgDDK ML和訳プロジェクト訳
- 「WDMデバイスドライバプログラミング完全ガイド」上
- Edword N. Dekker, Jpseph M. Newcomer著 株式会社クイック訳
- 「WDMデバイスドライバ」
- Chris Cant著 エクストランス株式会社訳 サイエンスパーク株式会社 監修