: : 效能達成 : :

Q :我們使用 WinDriver 11.2版本開發Windows PCI Driver, 有使用 DMA 的功能. 我們客戶反應在重覆多次開啟關閉應用程式(重複開啟/關閉 PCI driver)後, 再開啟應用程式會出現無法配置 DMA buffer 的情況, 必須在一段時間後才能在成功配置 DMA buffer. 請問有什麼方式能解決此問題嗎 ? 

A : 建議可以使用WinDriver最新版本去做開發,11.2版本已經太舊,無法得到適當支持。內存碎片在Windows操作系統中為已知問題,建議移動到一個分散 – 集中DMA,盡量預先分配 DMA存儲器,可以參考技術說明#3
http://www.jungo.com/st/support/tech_docs/td3.html

Q : 在關閉我的應用程序時,我的電腦會當機,在WD_IntDisable()中的代碼失敗。請問為什麼會這樣呢?我現在是使用Kernel PlugIn來處理中斷。

A : 如果您允許從內核插件中斷程序發生中斷,並同時從用戶模式停止作業,此情況有可能會發生當機(使用WD_IntDisable()或I InterruptEnable() / WDC_IntEnable() — which callWD_IntDisable())。由於中斷是有效的(已開啟的Kernel PlugIn),等待WD_IntDisable()返回時,此中斷無法產生,電腦會發生當機。
有種可能的解決方案,調用WD_IntDisable()/InterruptEnable()/WDC_IntEnable()作為一個核心操作,因此它停止中斷成功之前,Kernel PlugIn可使其中斷。
Q : 我的WD_Transfer()內存傳輸程序太慢,是否可以加快速度呢?

​A : 您可以使用直接存取記憶體的方法,取代WD_Transfer(),通過相關記憶體範圍內的虛擬使用者模式映射,這是由WD_CardRegister() in:cardReg.Card.Item[i].I.Mem.dwUserDirectAddress回傳的結果(其中”i”是在WD_ITEMS的”item”陣列中,記憶體基本位址的目錄)。
請參考WinDriver User’s Manuals (Function Reference與Improving Performance章節,WD_CardRegister()的說明)以及技術手冊74和 17,技術文件17也包括其他WinDriver如何改善您的驅動效能。
Q : 如何從Kernel PlugIn輸出debug的說明,讓我可以查看使用kernel debugger,例如WinDbg

A : 您可以使用WinDriverWD_DebugAdd()函數(v5.0.3及以上的版本皆可),在Debug Monitor中,從您的Kernel PlugInuser-mode的代碼印出debug的訊息,然後在Debug Monitor log中查看訊息。WD_DebugAdd()可以從任何user-modeKernel PlugIn被調用,包括KP_IntAtIrql()。您也可以選擇從WinDriver Debug Monitor發送debug訊息到kernel debugger,更多資訊請參考Technical Document 44。此外,您可以在您的Kernel PlugIn代碼中,添加調用到OS kernel,可以直接輸出到kernel debugger – 例如KdPrint() on Windowsprintk() on Linux
Q : 目前在user-mode中斷處理程序,看到中斷和啟動之間25微秒,請問此時間表示是否應該期待的性能?因為我正在考慮將中斷處理程序移至Kernel PlugIn,使我們能夠更快處理中斷。

A : user-mode的中斷處理程序可以服務高達每秒10,000次的中斷(雖然我們無法保證一個具體的數字,因為這取決於很多因素)。25微秒的等待時間一般應該不會發生,但是它會不定時發生。使用WinDriverKernel PlugIn功能會確保此情況不會發生。然而,沒有任何方法可以防止一些寫得很差的設備驅動程序,產生長時間的中斷,這種引起問題的驅動程序應查明並升級或刪除。有關更多資訊,請參考Technical Document 48
Q : 當我在Linux安裝Kernel PlugIn時,出現一個錯誤的畫面,是關於尚未解決的符號,請問是什麼意思呢?

A : 請確認已經安裝WinDriver kernel module – windrvr6.o/.ko (或windrvr.o – v5.2.2以及之前的版本) – 因為當您安裝Kernel PlugIn module之前,Kernel PlugIn driver取決於其運作的WinDriver driver module
有關更詳細的 Kernel PlugI安裝說明,請依據您WinDriver的版本去參考WinDriver User’s ManualsTechnical Document 62.

Q : 請問在一秒鐘內可以處理多少中斷?

A : 使用WinDriver的Kernel PlugIn功能,您可以期望每秒處理超過10萬的中斷,而不會錯過其中任何一個。對於Kernel PlugIn的處理範例代碼,使用DriverWizard可以為您的設備生成代碼(在wizard生成代碼之前,PCI和PCMCIA設備,先定義數據去清理中斷),或是可以在WinDriver WinDriver Kernel PlugIn看到範例代碼 –KP_PCI (WinDriver/samples/pci_diag/kp_pci — v7.0.0+)或KPTEST(WinDriver/kerplug/kptest/kermode — v6.2.3-a)。在用戶模式下,您可以處理每秒約5,000-10,000的中斷,但因為Windows不是即時的作業系統,所以您在一段時間中可能會錯過部分中斷(雖然WinDriver會告訴您,當您錯過中斷,以及有多少中斷遺漏),有關WinDriver中斷延時說明,請參考Technical Document 48.

Q :可以使用Kernel PlugIn去編寫SYSWindows驅動程序文件?

A : Kernel PlugIn可以建立附加的*.sys/.kext/.o/.ko kernel driver – 根據您的作業系統 – 去延伸您需要的WinDriver功能,您建立的Kernel PlugIn drive不是獨立的 – 只能user-mode driver一同運行。注意,使用WinDriverKernel PlugIn功能時,根據作業系統和WinDriver版本,您必須安裝kernel module —windrvr6.sys/.dll/.o/.ko or WinDriver.kext

Q : 當我在Kernel PlugIn處理完全中斷時,是否可以在user mode刪除中斷處理程序?

A : 可以的,您可在user mode刪除中斷處理程序,亦可以在Kernel PlugInuser mode各實現一些中斷處理。 KP_IntAtDpc()的返回值(當高優先的KP_IntIrql()例程返回TRUE)確定次數後,user mode的中斷處理程序將被執行。

Q : Kernel中,如何使用Kernel PlugIn的中斷例行程序去分配鎖定內存?

A : WinDriver可以實現 malloc()free()作為kernel mode的內存分配(參考Technical Document 34)。由於分配的內存已經被鎖定,您可以在Kernel PlugIn中斷例行程序中,使用此內存,也可以在user mode Kernel PlugIn應用中,分享內存緩衝區 – 其他更詳細資訊,參考inTechnical Document 41.

Q : 當我安裝Kernel PlugIn之後,得到錯誤訊息,視窗出現沒有被解決的符號,請問是什麼意思


A : 請參考FAQ #kplinux
Q : 請問Kernel PlugIn是免費的嗎? 試用版是否有包含此功能?


A : WinDriver試用版與正式版的功能並無差異,而Kernel PlugInWinDriver工具的一部份,因此試用版亦可使用

Q:如何利用WinDriver提升驅動程式的效能?

A:若您的設備是PCI,請使用DMA以獲得最佳性能,而非簡單的複製;此外亦建議您使用Kernel Plugin,讓中斷處理在內核模式做處理,
      存取和處理中斷速度會遠遠超過在用戶模式下的狀態。

      若您的設備是USB,請嘗試使用流(streaming)媒體數據傳遞,而不是簡單複製的塊(block)數據。此意味著內核會嘗試從設備中讀取更多的訊息,
      用戶模式可以準備一個數據的緩衝區,以便立即接收訊息。
      Streaming API:
      Stream_open:初始化
      stream_start:開始串流
      stream_read :從緩衝區讀取

     請注意,WinDriver無法實現USB/PCI的標準化驅動程式(例如:HID、影像),亦無法與作業系統的內核API做溝通,
     因此不能在WinDriver的驅動程式中使用作業系統的功能

   【舉例一】
    使用者可以編寫驅動程式,實現跟設備的串口通信,但無法在系統中創建COM port(),因為此動作需要使用作業系統的APIWinDriver是不支援此應用。

   【舉例二】
    使用者可以編寫驅動程式,將訊息從USB攝影機讀取,接著以某種方式將其訊息顯示在螢幕上,但作業系統將無法辨別它是視    頻類的USB攝像頭驅動程式,而       
不會把它當作電腦的內建相機(但可以從其他的軟體,存取該硬體)。此情況是因為WinDriver    所提供的API和函數,皆是在用戶模式的功能,
    若要定義該USB設備為HID設備,定義COM port將屬於核心模式的功能,因此      使用者無法使用WinDriver來做上述的應用。

Q:由於我使用PC讀取PCI設備卡時,速度非常的慢,因此欲使用Brust來改善,請問WDC_ReadAddrBlock()是否支援作Brust的讀寫?
     若不支援,我該如何增進我的存取效率?

A:主機端的軟體是無法真正的控制目標PCI使用Brust作存取,某些主機含有邏輯組可以支援Brust存取方式。
     從軟體方面來說,當使用WinDriver的API WD_Transfer(),是用一個指令移動一區塊的數據,對於移動64bit的數據時,我們使用64bit MMX指令,這是軟體部分        增進速率唯一的辦法,其餘都是部分都是硬體決定。欲增進速率的部分,建議您使用DMA,請參閱以下手冊。
     http://www.jungo.com/st/support/documentation/windriver/11.0.0/wdpci_manual.mhtml/Advanced_Issues.html#advanced_issues_dma

Q:當我在使用WinDriver的DMA來處理中斷訊號時會發現速率不夠高,因為每次在接收到中斷訊號時,WinDriver都會重啟DMA的功能,請問應該如何解決?

A:我們建議您使用Kernel Plugin來處理您的中斷訊號,請參閱                           
     http://www.jungo.com/st/support/documentation/windriver/11.0.0/wdpci_manual.mhtml/WinDriver_Kernel_PlugIn.html
     因為使用Kernel Plugin來處理您的中斷訊號時,整個中斷處理會在核心模式下處理完成,節省了轉移至用戶模式所需要的時間,請參考範例程式    
     <WD>\samples\pci_diag\kp_pci 。

Q : 請問利用WinDriver驅動程式開發工具是否會改變驅動程式的效能?

A : 一般來說,不論是PCI的讀取與寫入或是關於DMA的效能,這大部分取決於硬體或者作業系統的關係,WinDriver對效能不會有任何影響。

Q:WinDriver針對DMA Scatter Gather List的數量為何? 以及同時間裡命令搜尋的寬度為何?

A:WinDriver的傳輸速率沒有任何限制,請參閱技術手冊中相關DMA的部分,若您欲使用標準的通訊協定開發高階的儲存設備,WinDriver則是不適用的,
     因為Windows已經具備了相關的標準驅動程式。

Q:目前我需要開發PCI介面的驅動程式,並且能支援非常高速的中斷回應,請問WinDriver是否可以滿足此需求呢?

A:WinDriver有提供核心層內的中斷處理功能,請參閱技術手冊中關於內核外掛程式的章節:
     http://www.jungo.com/st/support/documentation/windriver/10.3.0/wdpci_manual.mhtml/WinDriver_Kernel_PlugIn.html