2011-08-10 84 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