地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

PCI アドレス空間

CPU と PCIバイスとは、両者で共有されたメモリにアクセスする必要がある。 そのメモリは、デバイスドライバPCIバイスを制御したり、それらの 間で情報をやり取りするために使用される。通常その共有メモリには、デバイスの コントロールレジスタやステータスレジスタの情報が含まれる。それらのレジス タ情報は、デバイスを制御し、その状態を読みとるために利用される。たとえば、PCI 上の SCSIバイス (コントローラ) 用のデバイスドライバは、そのステータスレジ スタを読んで、SCSIバイスSCSI ディスクに情報ブロックを書き込む準備が出来ているかを調べる。あるいは、 デバイスに電源が入った後、デバイスドライバは、デバイスを起動するために コントロールレジスタに書き込みをしたりする。

CPU のシステムメモリをこの共有メモリの代わりに使用することもできるが、 そうしたことがなされると、PCIバイスがメモリにアクセスするたびに、CPU は 一時停止し、PCIバイスがメモリの使用を終えるまで待たなければならなくなる。 メモリへのアクセスも、通常、一度にひとつのシステム機器だけに限られる。 したがって、その場合、システムの処理速度が遅くなる。 また、適切な管理方法のないままシステムの周辺機器にメインメモリへのアクセスを 許すことは、よい考えとはいえない。それは非常に危険な場合がある。悪質なデバイス がシステムを不安定にするからである。

周辺機器は独自のメモリ空間を持っていて、CPU はそれらの空間へアクセスできる。 しかし、デバイス側からのシステムメモリへのアクセスは、DMA(Direct Memory Access) チャンネルを使用して厳しく制御される。ISA デバイスは、ISA I/O(Input/Output)空間 と ISA メモリ空間のふたつのアドレス空間へアクセスできる。PCI には三つあり、PCI I/O 空間と PCI メモリ空間、PCI コンフィグレーション空間(configuration space) へアクセスできる。 これらすべてのアドレス空間は CPU からもアクセス可能である。その際、CPU は、 デバイスドライバを使って PCI I/O 空間と PCI メモリ空間へアクセスし、Linux カーネル内の PCI 初期化コードを使って PCI コンフィグレーション空間へアクセス する。

Alpha AXP プロセッサは、本来、システムアドレス空間以外のアドレス空間へは アクセスできない。それゆえ、Alpha AXP プロセッサは、サポートチップを使用して、 PCI コンフィグレーション空間等の他のアドレス空間にアクセスしている。サポート チップは、スパースアドレスマッピングスキーム( sparse address mapping scheme)を使用して、巨大な仮想アドレス空間の一部 を使い、それを PCI アドレス空間にマップしている。