2010-01-06 47 views
1

注:這不是一個問題,我遇到,但它是我 就好理解了(只是因爲我 想成爲一個更好的人,並 人類進一步 的地平線理解)。Win32 DDK:從驅動程序中斷調用API是否錯誤?

Raymond Chenbook的獎金章,

alt text http://ecx.images-amazon.com/images/I/51UE9zCS%2B2L._SL500_AA240_.jpg

雷蒙德給出了聲卡驅動程序中錯誤的例子:

原有的功能,稱爲在 硬件中斷時間,看起來像這樣在DDK :

void FAR PASCAL midiCallback(NPPORTALLOC pPortAlloc, WORD msg, 
          DWORD dwParam1, DWORD dwParm2) { 
    if (pPostAlloc->dwCallback) 
     DriverCallBack(pPortalloc->dwCallback, HIWORD(pPortalloc->dwFlags), 
        pPortalloc->hMidi, msg, dwParam1, dwParam2); 
} 

其功能的版本看起來 這樣的:

void FAR PASCAL midiCallback(NPPORTALLOC pPortAlloc, WORD msg, 
           DWORD dwParam1, DWORD dwParm2) { 
    char szBuf[80]; 

    if (pPostAlloc->dwCallback) { 
     wsprintf(szBuf, " Dc(hMidi=%X,wMsg=%X)", pPortalloc->hMidi, msg); 
#ifdef DEBUG 
    OutputDebugString(szBuf); 
#endif 
     DriverCallBack(pPortalloc->dwCallback, HIWORD(pPortalloc->dwFlags), 
        pPortalloc->hMidi, msg, dwParam1, dwParam2); 
    } 
} 

不僅是有零售代碼調試吃剩的東西,但它是 在調用硬件中斷時間noninterrupt-安全功能 。如果 wsprintf函數曾經得到 丟棄,則系統將在 硬件中斷內發生 段不存在的故障,導致很快死亡。

現在,如果我在看那個代碼,我不會猜到一個調用庫函數wsprintf會是一個問題。如果我的驅動程序代碼需要使用Win32 API,會發生什麼情況?

什麼是段錯誤?我瞭解頁面錯誤的概念:我需要的代碼位於已交換到硬盤驅動器的頁面上,並且需要在代碼執行繼續之前從硬盤驅動器恢復。當我們處於設備驅動程序的中斷時,什麼是segment fault

頁面錯誤保護模式相當於段故障的?如何避免段錯誤? Windows是否換出設備驅動程序代碼?我將如何阻止「wsprintf被丟棄」?什麼會導致wsprintf被「丟棄​​」?什麼是「丟棄」?丟棄的優點是什麼?什麼時候發生什麼un丟棄

爲什麼從一個驅動程序裏調用一個API調用不好,以及如何解決它?

+0

請注意,上面的MIDI東西是不是司機的東西。使用MIDI堆棧的代碼在用戶模式下運行100%,因此下面答案中的大部分註釋並不特別相關。 – 2010-01-07 01:01:10

+0

我不想抄襲太多雷蒙德的書,但故事開頭,稱它從Windows 95推出的時代是 - 遙想當年PC蜂鳴器是由8254 PIC運行:P – 2010-01-07 01:24:15

回答

3

分段錯誤通常是指無效的內存訪問。在大多數現代操作系統中,產生seg-fault的機制也被用來提供請求分頁機制。他們傾向於將內存頁「交換」到光盤上並將它們標記爲無效,下一次指令訪問該內存位時,內核會認識到它不是真的錯誤,並且會在內存中頁面。

Windows在某些情況下無法處理頁面錯誤,其中一個處於中斷狀態。這只是它設計的方式。例如,假設你在從磁盤驅動器讀取內存頁數據的代碼中出現頁面錯誤,怎麼可能處理這種情況?所以他們對什麼樣的操作模式允許頁面定義和什麼不是定義有一些限制。如果在中斷中導致頁面錯誤,內核將強制發生BSOD。

如果您需要執行某些可能需要分頁的操作,則應該在中斷上下文中執行的操作是在中斷處理程序中對所謂的延遲過程調用(DPC)進行排隊。 DPC然後在DPC級別執行(如果您閱讀了DDK函數的某些描述,您將會看到提及的內容)。 DPC級別可以分頁,因此您可以使用任何您需要的功能。

至於司機的東西,你可以標記你的一些代碼作爲非分頁的,你可以分配非分頁池是內存,你可以在不引起頁面錯誤訪問。 wsprintf可以被分頁,因爲沒有人使用它並且內核回收內存。

+0

是* wsprintf *的一部分「我的代碼」,我可以標記不可分頁?還是它堅持可分頁? – 2010-01-06 21:00:48

+0

@IanBoyd:SDK包含源代碼,因此您可以編譯自己的庫並將其標記爲可分頁。 – 2012-11-04 19:01:49

相關問題