はじめに
PCIデバイス制御方法
内部構造
DLL部分
NT用ドライバー
95/98用ドライバー

PCIデバイスはメモリー空間、IO空間、コンフィグレーション空間と割り込み信号をもっています。Windowsでこれらを制御する場合次の点に注意しなければなりません。

メモリー空間

PC/AT互換機ではPCIのメモリー空間はCPUのメモリー空間にそのまま割り当てられています。つまりベースアドレスレジスターの値を調べ、その値をベースアドレス値としてCPUのメモリー空間にアクセスすればよいのです。

しかし仮想メモリ空間のことを忘れてはいけません。アプリケーションプログラムからは仮想メモリーが見えるだけです。PCIデバイスのメモリー空間がE0000000から始まっていたとしましょう。ここでリスト1のようしてもうまくいきません。アプリケーションのポインターが指しているのは仮想メモリー空間のアドレスなのです。仮想アドレス空間にマップされていないメモリー領域にはアクセスできません(図3)。

仮想メモリをアクセスしたい物理メモリにマップしリード・ライトを行う必要があります。

{
    char *p
    p = 0xE0000000; //PCIメモリーのアドレスを代入
    d = *p; //メモリーからのリード
    d++;
    *p = d; //メモリーへのライト
}

リスト1 メモリーアクセスプログラム(上手くいかない例)

 

wpe1.jpg (32424 バイト)

図3 仮想メモリ

I/O空間のアクセス

NTでは、I/O空間もOSによって保護されています。ユーザーアプリケーションからI/O入出力の命令を実行しても保護違反が発生してアクセスできません。I/O命令を実行するにはカーネルモードから行わなければなりません。カーネルモードから任意のI/Oアドレスを読み書きする仕組みを作成します。

割り込み処理

基本的に割り込み処理はカーネルモードのデバイスドライバー内に持たなければなりません。またPCIデバイスでは割り込みの共有を考慮して割り込み処理.ルーチンを作らなければなりません。

このような制限がありますが、このDLLではDOSPCIデバックライブラリと同じような感覚で使用できるように、割り込みが発生するとユーザーモードの関数が呼び出される仕組みを提供します。

戻る 上へ 進む