第 8 章 特定のチップ セットの拡張サポート
11.6 Kernel PlugIn の仕組み
11.6.4 Kernel PlugIn のサンプル コードと生成されたコードのディレクトリ構造
11.6.4.1 pci_diag および kp_pci のサンプルディレクトリ
kp_pci.c ファイルで、Kernel PlugIn のサンプル コード (KP_PCI) を実装してます。このサンプル ドライバ は、WinDriver PCI 診断プログラムのサンプル (pci_diag) の一部で、KP_PCI ドライバに加え、ドライバ (pci_diag) と通信を行うユーザーモード アプリケーション、およびそのユーザーモード アプリケーションと Kernel PlugIn ドライバの両方で使用できる API を含む共有ライブラリが含まれます。C 言語でこのサンプル のソースを実装してます。
以下、WinDriver/samples/pci_diag/ ディレクトリ以下のファイルの概要です。
z
kp_pci/ - 以下の KP_PCI Kernel PlugIn ドライバ ファイルを含みます。○ kp_pci.c: KP_PCIドライバのソースコード
○ Kernel PlugIn のビルド用の Project および/または make ファイルと関連ファイル。Windows プ
ロジェクトファイルは、\x86 (32 ビット) および\amd64 (64 ビット) ディレクトリ以下のターゲッ ト IDE のサブディレクトリ(msdev2008 / msdev2005 / msdev2003 / msdev_6) にありま す。
○ ターゲット OS 用の KP_PCI Kernel PlugIn ドライバのプリコンパイル済みバージョン:
− Windows x86 32 ビット: WINNT.i386\kp_pci.sys − Windows 2000 およびそれ以 降用にビルドしたドライバの 32 ビットバージョン
− Windows x64: WINNT.x86_64\kp_pci.sys − Windows Server 2003 およびそれ以 降用にビルドしたドライバの 64 ビット バージョン
− Linux: Linux カーネルモジュールは、ターゲットにインストールされているカーネルバー
ジョンのヘッダーファイルでコンパイルする必要があるため、プリコンパイル済みバー ジョンはありません (セクション 14.4 を参照してください)。
z pci_lib.c: WinDriver の WDC API を使用して PCI デバイスにアクセスするライブラリの実装。
ライブラリの API をユーザーモード アプリケーション (pci_diag.c) と Kernel PlugIn ドライバ (kp_pci.c) の両方で使用します。
z pci_lib.h: pci_lib ライブラリのインターフェイスを提供するヘッダーファイル
z pci_diag.c: サンプルの診断ユーザーモード コンソール (CUI) アプリケーションの実装で、
pci_lib と WDC ライブラリを使用して PCI デバイスとの通信を行います。
このサンプルでは、ユーザーモードの WinDriver アプリケーションから Kernel PlugIn ドライバへの アクセスを行います。デフォルトでは、KP_PCI Kernel PlugIn ドライバへのハンドルで、選択した PCI デバイスを開きます。成功した場合、セクション [11.6.3] の説明のとおり、Kernel PlugIn ドライ バと通信を行います。Kernel PlugIn へのハンドルを開くのに失敗した場合、デバイスとのすべての 通信をユーザーモードから実行します。
z pci.inf (Windows): Windows 2000 / XP / Server 2003 / Server 2008 / Vista / 7 用のサンプル
WinDriver PCI INF ファイル。注意: このファイルを使用するには、ファイル内の Vendor および
Device ID を対象のデバイスの Vendor および Device ID に変更してください。
注意: MSI (Message-Signaled Interrupt) または MSI-X (Extended Message-Signaled Interrupt) を Windows Vista およびそれ以降で使用する場合 (MSI / MIS-X をサポートする PCI カード向け)、
サンプルの INF ファイルを修正または置き換えて、特定の MSI 情報を含める必要があります。
MSI 情報が含まれない場合、マニュアルのセクション 9.2.6.1 で説明したとおり、WinDriver は対象 のカードに対して、レガシーなレベルセンシティブ割り込み処理を使用します。
z pci_diag: pci_diag ユーザーモード アプリケーションのビルド用の Project および/または makefile。
Windows プロジェクト ファイルは、\x86 (32 ビット) および \amd64 (64 ビット) ディレクトリ以下の ターゲット IDE のサブディレクトリ (msdev2008 / msdev2005 / msdev2003 / msdev_6 / cbuilder4 / cbuilder3) にあります。
MSDEV ディレクトリには、Kernel PlugIn ドライバおよびユーザーモード アプリケーションのプロ ジェクト用のワークスペース/ソリューション ファイルも含まれています。
Linux などその他の OS 用の makefile は、それぞれ <OS>/ サブ ディレクトリにあります (たと えば、LINUX/)。
z 対象の OS 用のユーザーモードアプリケーション (pci_diag) のプリコンパイル済みバージョン
○ Windows: WIN32\pci_diag.exe
○ Linux: LINUX/pci_diag
z files.txt: サンプル pci_diag ファイルの一覧
z readme.txt: サンプル Kernel PlugIn ドライバ、ユーザーモードアプリケーション、ビルド手順お よびコードのテスト手順の概要
注意: BMD (Bus Mastering DMA Validation Design) ファームウェアを持つ Xilinx Virtex 5 PCI Express チッ プのサンプル (WinDriver/xilinx/virtex5/bmd/) のディレクトリの構造は、次の項目を除いて、汎
用的な PCI サンプル pci_diag ディレクトリと同様です。サンプルの virtex5_lib ライブラリファイルは
lib/ サブディレクトリ以下にあります。Virtex5_diag ユーザーモードアプリケーションファイルは diag/ サブディレクトリおよび kp/ サブディレクトリ以下にあります。kp/ サブディレクトリには、Kernel PlugIn ドライバ (KP_VRTX5) のソースファイルと Windows 用にのみ makefile が含まれます。
11.6.4.2 DriverWizard で生成された Kernel PlugIn ディレクトリ
対象のデバイス用に DriverWizard で生成された Kernel PlugIn のコードには、カーネルモードの Kernel
PlugIn のプロジェクトと通信を行うユーザーモードアプリケーションが含まれます。汎用的な KP_PCI と
pci_diag サンプルとは対照的に、Wizard で生成されたコードは、対象のデバイス用に検出または定義し たリソース情報を使用します。同様に、コードを生成する前に Wizard で定義したデバイス独自の情報も使 用します。
セクション [11.6.3] の説明のとおり、レガシー PCI または PCMCIA の割り込みを処理するドライバを使用す る際には、コードを生成する前に、DriverWizard で割り込みを検知するのに読み書きするレジスタを定義 し、これらのレジスタから読み込む、またはレジスタへ書き込む関連するコマンドを設定することを強く推奨し ます。それによって、Wizard で生成された割り込み処理のコードで、定義したハードウェア独自の情報を使 用できるようになります。また、MSI / MSI-X をサポートするハードウェア用に割り込みを処理する場合には、
その転送コマンドを用意することを推奨します。用意しない場合には、MSI / MSI-X の有効に失敗したり、デ フォルトのレベル センシティブな割り込みを使用して割り込みを処理します (ハードウェアでサポートしてる 場合)。注意: 割り込みが無効になるまで、転送コマンド用に割り当てたメモリを利用可能にしとく必要があり ます。
以下、DriverWizard で Kernel PlugIn のコードを生成した場合の生成されたファイルの概要です (xxx は、
コードを生成する際に指定したドライバの名前を表します。また、kp_xxx は、コードを保存先として指定し たディレクトリを表します)。注意: 以下の概要は、生成される C コードについて示しています。Windows で
は、C Kernel PlugIn ドライバ (C# ではカーネルモードドライバを実装できないため)、.NET C# ライブラリ、
Kernel PlugIn ドライバと通信する C# ユーザーモードアプリケーションを含む、類似の C# コードを生成する
こともできます。
z kermode/ - 以下の KP_XXX Kernel PlugIn ドライバファイルを含みます。
○ kp_xxx.c: KP_XXX ドライバのソースコード
○ Kernel PlugIn ドライバのビルド用の Project および/または make ファイルと関連ファイル。 Windows プロジェクトファイルは、\x86 (32 ビット) および\amd64 (64 ビット) ディレクトリ以下 のターゲット IDE のサブディレクトリ (msdev2008 / msdev2005 / msdev2003 / msdev_6) にあります。Linux などその他の OS 用の makefile は、それぞれ <OS>/ サブディレクトリ にあります (たとえば、LINUX/)
z xxx_lib.c: WinDriver の WDC API を使用して、対象のデバイスへアクセスするライブラリの実 装。このライブラリの API をユーザーモード アプリケーション (xxx_diag) と Kernel PlugIn ドライ バ (KP_XXX) の両方で使用します。
z xxx_lib.h: xxx_lib ライブラリのインターフェイスを提供するヘッダーファイル
z xxx_diag.c: サンプルの診断ユーザーモードコンソール (CUI) アプリケーションの実装で、
xxx_lib と WDC ライブラリを使用して PCI デバイスとの通信を行います。
このサンプルでは、ユーザーモードの WinDriver アプリケーションから Kernel PlugIn ドライバへの アクセスを行います。デフォルトでは、KP_XXX Kernel PlugIn ドライバへのハンドルで、選択した PCI デバイスを開きます。成功した場合、セクション [11.6.3] の説明のとおり、Kernel PlugIn ドライ バと通信を行います。Kernel PlugIn へのハンドルを開くのに失敗した場合、デバイスとのすべての 通信をユーザーモードから実行します。
z xxx_diag: xxx_diag ユーザーモード アプリケーションのビルド用の Project および/または makefile。
Windows プロジェクト ファイルは、\x86 (32 ビット) および \amd64 (64 ビット) ディレクトリ以下の ターゲット IDE のサブディレクトリ (msdev2008 / msdev2005 / msdev2003 / msdev_6 / cbuilder4 / cbuilder3) にあります。
MSDEV ディレクトリには、Kernel PlugIn ドライバおよびユーザーモード アプリケーションのプロ ジェクト用のワークスペース/ソリューション ファイルも含まれています。
Linux などその他の OS 用の makefile は、それぞれ <OS>/ サブ ディレクトリにあります (たと えば、LINUX/)。
z xxx_files.txt: 生成されたファイルの一覧と生成されたコードのビルド手順
z xxx.inf: 対象のデバイスの WinDriver INF ファイル (Windows で、PCI または PCMCIA などの Plug and Play デバイスの場合のみ)