SCIENCE PARK

デバドラ講座

【 デバドラ講座6 : 内部バス、デバイスレジスタ、メモリレジスタ 】

ハードウェアの知識

デバイスドライバの開発に際に、直接関わりのあるPCハードウェアの概念の説明をします。

1.内部バス

PCの中にはマザーボードが存在します。マザーボードにはインタフェース(差込口)があり、そこにポートを差し込むことができます。(図1)ポートには周辺機器との接続口があり、PCの外側からその接続口を見ることができます。接続口にデバイスを接続することで、周辺機器を使うことができます。

図1:PCと周辺機器のつながり
図1:PCと周辺機器のつながり

周辺機器を操作する時も含めて、PCはデータのやり取りを行うことによって動いています。このことを、デジタルカメラから画像を読み込む時を例にして見てみます。ユーザーがOSを介してカメラに画像を下さいというコマンド(データ)を送ります。すると、そのコマンドを受け取ったカメラは要求された画像(データ)を送り返します(概略)。このようにデータをやり取りしてPCは動いています。データのやり取りを行うためには、データをやり取りするための道、つまり転送路が必要です。この転送路をバスと呼びます。

PCバスがどのように機能しているかは、交通機関の働きとよく似ています。電車は人を運ぶ機械、PCバスはデータを運ぶ線路です。

バスには内部バスと外部バスがあります。ポートから周辺機器につなぐバスを外部バスと呼び、それ以外のPC内のバスを内部バスと呼びます。内部バスは、CPUとメモリ、メモリとポート、CPUとポートをつなぎます。ドライバ開発を学ぶ上では、ポートに直接関わる内部バスに注目する必要があります。

半導体技術の進化に伴い、バスも大きく変化してきました。転送路を走るデータのサイズ(バス幅)は8ビット→16ビット→32ビット→64ビットと増えていきました。転送方法もシリアル(1本の信号線)からパラレル(複数の信号線)と変化していきました。シリアルとパラレルは双方に利点・欠点があり、現在はパラレルから高速シリアルへと転換していっています。内部バスが変化していく中で、現在のバスに大きな影響を与えたバスをいくつか下記に示します。

1-1.ISAバス(Industrial Standard Architecture)

ISAバスはバス幅16ビットのバスです。一時はPC用のバス規格としては最も普及し、事実上の世界基準となりました。しかし、ISAバスの最大転送速度は8MB/sで現代のPCの性能とは釣り合わなくなり、新しいPCではほとんど実装されることはありません。

1-2.MCAバス(Micro Channel Architecture)

MCAバスはISAバスに継ぐものとしてIBM社が開発しました。技術的には優れていましたが、価格が高額、特許使用料を支払わなければならない、ISAバスと互換性がない、といったことを理由に市場には普及しませんでした。しかし、MCAバスの概念は、他のバスアーキテクチャにも繰り返し利用されており、現在も存続しています。詳細は省きますが、MCAバスの概念はPnPソフトウェアの概念にも重要な役割を担っています。

1-3.PCIバス(Peripheral Components Interconnect bus)

現在の内部バスはPCIバスが基本となっています。それまでの内部バスは、バスの総帯幅域に制約がありました。ディスプレイメモリの書き込み時に発生するような単一のメモリ転送の処理が、ユーザーには受け入れられる時間ではありませんでした。そこで、より高速でメモリに近い速度で動作するバスが求められていました。PCIバスは転送速度も速く、ISAバスに変わる新しい標準バスとなっています。現在、すべての周辺機器が最終的にはPCIバスに繋がっています(図2)。また、PCIバスはプラットフォームにも依存していないので、Windows以外のPCでも採用されています。

図2:PCIバスと周辺機器のつながり
図2:PCIバスと周辺機器のつながり

2.デバイスレジスタ

2-1.デバイスレジスタ

デバイスレジスタはシステム(OS)とデバイスを通信させるために存在するレジスタです。IOポートとも呼ばれます。デバイスとPC間の通信の大部分をデバイスレジスタが行います。デバイスレジスタはポートの中に存在しており、その有無、個数、機能等はデバイスのハードウェアによって決定します。例えば、プリンタはコマンドレジスタ、ステータスレジスタ、データレジスタの3つのデバイスレジスタが存在します。

システムは起動時にシステム内に存在するIO空間にデバイスレジスタをマップ(対応付け)します(図3)。デバイスレジスタをマップすると、実際にはレジスタはIO空間に存在していませんが、CPUはあたかもレジスタがIO空間に存在するかのように制御を行うことができます。CPUのIO空間使用量は最初から決められています。

図3:デバイスレジスタ
図3:デバイスレジスタ

デバイスレジスタはI/O命令で指定された特定のアドレス(ポートアドレス)やメモリアドレス空間内の位置(メモリマップレジスタ)によって表されています。デバイスレジスタの幅は1バイト、2バイト、4バイト、8バイトがあり、どの幅になるかはハードウェアの仕様で決まっています。

デバイスレジスタにはドライバからアクセスします。ドライバはデバイスレジスタにアクセスするための関数を利用して、データの読み書きのみでデバイスレジスタを操作します。PCはデバイスと通信を行う場合、目的の操作を行う要求(コマンド)や、デバイスの状態を問い合わせる要求(ステータス要求)を送ります。例えば、コマンドがPCから送られてきた場合、ドライバはその情報をドライバレジスタに書き込むことで、デバイスにコマンドを送ることができます。もし、結果をPCに返す必要のあるコマンドだとしたら、ドライバはデバイスレジスタからその情報を読み込みます。

3.デバイスメモリ

デバイスメモリはデバイスレジスタと同じようにシステム(OS)とデバイスを通信させるために存在するメモリです。デバイスレジスタはポート内で分離した空間で存在していますが、デバイスメモリはブロック単位の連続した空間で存在しています。(図4)

図4:デバイスメモリ
図4:デバイスメモリ

システムは起動時にシステム内に存在するメモリ空間にデバイスメモリをマップします。実際のデバイスメモリはポートに存在しますが、メモリ空間にマップすることでCPUはデバイスメモリがあたかもメモリ空間にあるかのように制御を行うことができます。デバイスによっては、デバイスレジスタをメモリ空間にマップし、アクセスするものもあり、メモリマップデバイスレジスタと呼ばれます。デバイスメモリの有無、大きさ等はデバイスのハードウェア設計で決定します。CPUのメモリ空間使用量は最初から決定しています。

デバイスメモリにはドライバからアクセスします。ドライバはデバイスメモリにアクセスするための関数を利用して、データの読み、書きのみでデバイスメモリの制御を行います。システムから見るとデバイスレジスタとデバイスメモリの扱いは同じですが、WDKで使用する関数が異なります。デバイスメモリの幅は1バイト、2バイト、4バイト、8バイトがあり、ハードウェアの仕様によってどのメモリ幅を使用するかが決定します。

参考資料

MYCOMジャーナル 第40回~第176回「バスのアーキテクチャ」
http://journal.mycom.co.jp/column/sopinion/
「Windows NTデバイスドライバプログラミング」
アート・ベーカー著 WinProgDDK ML和訳プロジェクト訳
「WDMデバイスドライバプログラミング完全ガイド」上、下
Edword N. Dekker, Jpseph M. Newcomer 著 株式会社クイック 訳
組み込みネット「メモリとポート」
http://www.kumikomi.net/article/explanation/2003/10kumi/27.html
page up