Interrupt on Windows

device 完成 I/O request 後,發出一個 interrupt,這時候 CPU 會將控制權轉給 kernel,kernel 會到 interrupt dispatch table (IDT) 中去查詢 device 的 ISR。因為在執行 ISR 時,其它 interrupt 會被 disable,故 ISR 通常只做 enable interrupt,至於真正處理 interrupt 的程式則會由 ISR 放到 DPC 中。


ISR 產生一個 DPC object,然後放到 DPC queue 中。DPC object 就是 DPC routine。ISR 結束後,會將 IRQL 恢復中斷前的等級。當 DPC queue 中有資料時,如果 IRQL 降到 dispatch level 以下,kernel 會發出一個 DPC software interrupt,由 DPC queue 中拿出一個 DPC routine 來執行。這個 DPC routine 可能會啟動在 device 中的下一個 I/O request。


由於 DPC routine 可以執行在任意的 thread,當 DPC routine 執行時,會將目前 user space 正在跑的 thread context switch 出去,然後跑 DPC routine。這種設定下,如果 DPC routine 需要將一些資料回傳給呼叫 I/O request 的 thread,則一定不能由它自己來做。因為每個 user thread 的位址空間都是分開的,既然 DPC routine 是執行在任意的 thread,在 DPC routine 中隨意更改 user thread 位址空間的資料就有很大的風險。


在 Windows 中使用 asynchronize procedure call (APC) 來完成。當 DPC routine 完成後,它會透過 I/O manager 在 APC queue 中放入一個 APC。接著完成 I/O request。


由於 APC 是在指定的 thread 中執行,當指定的 thread 得到執行時,kernel 會發出一個 APC software interrupt,此時 interrupt dispatch program 就會參照 IDT 中 APC 指向在 I/O manager 中的 APC routine。APC routine 會將資料寫入當前 thread 的位址空間,將 handle 設成 signaled 狀態,移除 IRP 並返回 user thread。


user mode 程式也可以使用 APC。假如我們使用 ReadFileEx 時,可以指定一個 complete routine。這個 complete routine 就是所謂的 user mode APC。


留言

熱門文章