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

 

NTとの違い

OS95/98の場合は開始時にロードされるドライバーが95VxDになるだけで処理の流れはほとんど変わりません。ドラーバ-を呼ぶDLLNTでも95/98でも全く同じDeviceIoControlを実行します。NTの場合と同じ働きをするVxDを作成します。

コンフィグレーション空間のアクセ方法

通常のデバイスドライバーではOSの提供するコンフィグレーションマネージャを呼び出してベースアドレスレジスター値や、インターラプトラインレジスターの値を得ますが任意のレジスターにアクセスできるわけではありません。

そこでPCIBIOSを呼び出して行います。AXレジスターにエントリーの番号を設定してINT 1A割り込みを起こせば呼び出せます。

VxDからINTを実行するのはVMMCallを使用します。リスト6はコンフィグレーション空間からダブルワード読み出しするアセンブラコードです。実際のドライバーコードはC言語とインラインアセンブラを使用して記述しています。

 mov  ax, word ptr 0xb10a  	PCIBIOSファンクション番号(Read a PCI Configuration Dword)
 mov  bx, word ptr pci_address	バス、デバイスファンクション番号をBXレジスターにセット
 mov  di, offsetadd		コンフィグレーションレジスター番号
 push dword ptr 1ah		
 VMMCall Exec_VxD_Int		PCIBIOSを呼ぶ
 mov  d, ecx 			ECXに読み出し結果がある
リスト6 VxDからPCIBIOSの呼び出し方法(Read a PCI Configuration Dwordの例)

PCIBIOSにはいろいろな機能がありますが、コンフィグレーションレジスタのリード、ライトとPCIバスの数を調べるためのGet PCI BIOS Present Statusのみを使用しています。NTの場合と処理の流れを同一にしてPCIデバイス検索関数等は、DLL内部でコンフィグレーションリードを組み合わせて検索処理を実現します。

物理メモリーへのアクセス

95/98NTと多少メモリーの管理方法が異なりますが、仮想アドレス空間にマップしてからアクセスする点は同じです。

マップする部分が_MapPhysToLinear()になります。

I/Oへのアクセス

I/OについてはWin32の関数の中に_inp_inpw_inpd_outp_outpw_outpdがあり95/98では利用できます。NTと同様にドライバー内で処理するようにしてもよいのですが、これを利用してDLL内部だけで動作させています。

割り込み処理

割り込みについてはDLL部分も含めてNTと大きく異なっています。95/98には名前付きイベントが無い事や、割り込みは仮想割り込みコントローラーVPICDを使用することなどからです。NTの場合はドライバー内部のISRで割り込み線をデアサートにしなければなりませんでしたが95/98では割り込みをマスクするVPICDのサービスがありトリッキーな手法を用いることなく実装することができました。しかし割り込みの共有には対応できていないため同じ割り込みを利用するデバイスがあるとそのデバイスに悪影響を及ぼす可能性があります。デバイスマネージャーで同じ割り込みを利用しているデバイスを使用不可状態にして割り込みを使用する必要があります。

戻る 上へ