2011-08-10 80 views
2

我有一个Windows控制台应用程序,它使用并行IO卡进行高速数据传输。 (通用标准HPDI32ALT为什么设备驱动程序会导致页面错误?

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

  • 在启动时:我请求一个指向IO缓冲区的指针。
  • 在我的主循环:
    • 上API在设备的缓冲区等待室(低水印)
    • 块填充传输数据的IO缓冲器
    • 由指针传递到IO开始传输到设备缓冲液(在此期间,API使用DMA PCI总线上移动数据到卡)上的API
    • 块等待IO完成

但是,当我在sys内部工具进程资源管理器中查看进程时,发现大量页面错误(每秒大约6k次),应用程序似乎在正确的数据速率和长时间的持续吞吐量下正常工作。 。我正在向该卡移动〜30MB/s。

我有足够的内存,并合理确信页面错误不是磁盘IO相关。

有什么想法可能导致页面错误?对于这个在接收模式下使用相同的IO卡的应用程序,我也有一个接收端。接收模式使用API​​不会导致大量的页面错误。

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

回答

0

因此,您的应用程序询问驱动程序是否有内存缓冲区,并将发送数据复制到该缓冲区中?这是一个非常奇怪的模型,通常你让应用程序管理缓冲区。

如果您错误的是6K pages/s,而您只能传输30MB/s,那么您在传输的每个页面上几乎都会发生页面错误。当你从驱动程序获取数据缓冲区时,它是否始终为零填充?我想知道你是否获得了每次转账的需求零缺点。

-Scott

+0

手册上说,使用IO缓冲器允许它分配一个内存块是在用于DMA性能原因物理存储器中连续。 – JeffV