2011-08-10 17 views
2

私は高速のデータ伝送のためにパラレルIOカードを使用するWindowsコンソールアプリケーションを持っています。 (一般的な標準HPDI32ALTデバイスドライバがページフォールトを引き起こすのはなぜですか?

私のプロセスはユーザーモードで実行されていますが、デバイスのAPIの後ろには、カーネルモードのドライバアクティビティ(PCI DMA転送、デバイスステータスレジスタの読み込みなど)があります。おおよそ次のようになります。

  • 起動時にAPIからのIOバッファへのポインタを要求します。私のメインループで
  • :デバイスのバッファに部屋を待っているAPI(低ウォーターマーク)
  • 上 が
    • ブロック
    • はIOへのポインタを渡すことによって、デバイスへの送信を開始し、送信データとIOバッファを埋めますIOは
を完了するのを待っているAPI上のバッファ(この時間の間にAPIがカードにデータを移動するためにPCIバス上のDMAを使用しています)
  • ブロック10

    アプリケーションは、適切なデータレートと長時間のスループットで正常に動作しているように見えますが、sys内部ツールプロセスエクスプローラのプロセスを見ると、多数のページフォルト(〜6k /秒) 。私は〜30MB/sをカードに移動しています。

    私は十分なRAMを持っており、ページ違反がディスクIO関連ではないことを合理的に確信しています。

    ページフォルトの原因と考えられることはありますか?私はまた、受信モードで同じIOカードを使用しているこのアプリケーションの受信側を持っています。 APIの受信モードを使用しても、多数のページフォールトは発生しません。

    IOバッファをカーネルモードに移動すると、ページフォルトが発生する可能性がありますか?

  • 答えて

    0

    アプリケーションがドライバにメモリバッファを要求し、そのバッファに送信データをコピーしますか?これはかなり奇妙なモデルです。通常、アプリケーションでバッファを管理できるようにします。

    6Kページ/秒のエラーが発生していて、30MB /秒しか転送していない場合は、転送したページごとにほとんどページフォールトが発生しています。あなたは、ドライバからデータバッファを取得するとき、それは常にゼロ充填ですか?毎回の転送で要求ゼロのフォルトが発生しているかどうかは疑問です。

    -scott

    +0

    マニュアルは、IOバッファを使用することがDMA性能の理由から、物理メモリ内の連続するメモリのブロックを割り当てることを可能にすることを言います。 – JeffV

    関連する問題