为什么设备驱动程序会导致页面错误?

时间:2011-08-10 13:03:31

标签: windows driver page-fault

我有一个Windows控制台应用程序,它使用并行IO卡进行高速数据传输。 (一般标准HPDI32ALT

我的进程在用户模式下运行,但是,我确信在设备的API后面有一些内核模式驱动程序活动(PCI DMA传输,读取设备状态寄存器等)。工作模型大致是这样的:

  • 启动时:我从API请求指向IO缓冲区的指针。
  • 在我的主循环中:
    • 阻止API等待设备缓冲区中的空间(低水位线)
    • 使用传输数据填充IO缓冲区
    • 通过将指针传递给IO缓冲区开始传输到设备(在此期间,API使用PCI总线上的DMA将数据移动到卡上)
    • 阻止等待IO完成的API

应用程序似乎正常工作,具有适当的数据速率和持续的吞吐量很长一段时间,但是,当我查看sys internals工具进程资源管理器中的进程时,我看到大量的页面错误(每秒约6k) )。我正在向卡片移动~30MB / s。

我有足够的RAM,并且可以合理地确定页面错误与磁盘IO无关。

有关可能导致页面错误的任何想法?此应用程序的接收方也在接收模式下使用相同的IO卡。接收模式使用API​​不会导致大量页面错误。

将IO缓冲区移动到内核模式的行为会导致页面错误吗?

1 个答案:

答案 0 :(得分:0)

那么你的应用程序要求驱动程序提供内存缓冲区并将发送数据复制到该缓冲区中?这是一个非常奇怪的模型,通常你让应用程序管理缓冲区。

如果您的故障率为6K页/秒,并且您只传输30MB / s,那么您传输的每个页面几乎都会出现页面错误。从驱动程序获取数据缓冲区时,它是否始终为零填充?我想知道你是否每次转移都要求零故障。

-Scott