2014-10-19 81 views
-1

我嘗試學習Windows操作系統的內部構件。 是SSDT定義爲「所有系統調用地址列表」? 是SSDT還允許捕捉硬件事件的中斷處理機制? 感謝您的回答。所有系統調用都需要Windows上的SSDT?

+0

每個問題一個問題。因爲你只能標記一個正確的答案。 – 2014-10-19 19:51:03

+0

完成了,現在只有一個。 – 2014-10-19 19:58:55

回答

2

不,SSDT不是操作系統捕捉硬件事件的方式。如果我們從硬件開始說一個網卡的PCI卡,它會有一個類型中斷的信號,它通過PCI接口進入中斷控制器。在PC中,這將是一個「APIC」(高級可編程中斷控制器),而APIC本身又連接到處理器核心。其他硬件以類似的方式工作,所以我將使用API​​C作爲以下示例。

當OS初始化APIC時,它將爲每個硬件中斷提供一個「向量」,它將進入中斷向量表 - 每個中斷向量條目將包含處理器在該中斷處於活動狀態時跳轉到的地址。在x86中,中斷向量表被稱爲「中斷描述符表」,因爲向量不僅僅是一個簡單的地址跳轉到 - 它還包含一些關於如何處理中斷等的額外信息。

所以當我們的網絡適配器接收到一個數據包時,它會「拉」中斷信號。處理器會檢測到中斷,當中斷髮生時,中斷控制器給出要使用的向量。處理器查找向量,保存當前狀態並跳轉到向量中的地址。

在矢量內部,操作系統將執行一些「管理」工作,然後查找哪個設備驅動程序要求瞭解該中斷,以便操作系統找到我們的網絡適配器驅動程序,並將其稱爲中斷處理例程。中斷處理代碼檢查網絡適配器的狀態,發現它是一個「新的數據包已到達」類型的中斷,從緩衝區中讀出數據並可能更新某些信號量或類似信息,以便某些驅動程序函數可以開始執行「我們收到了一個新的數據包」代碼。一旦完成,中斷處理程序返回到操作系統。

從中斷處理代碼返回時,操作系統將檢查是否有任何「新進程被喚醒」,所以等待數據包的進程現在將是「可運行的」,並且可能在此時切換進程,或者只是將其標記爲「未來運行」。

的SSDT時使用的應用程序調用,也就是說,CreateFileReadFileWriteFileCloseHandle,以及任何其他系統調用(也有相當多的人)的。基本上,SSDT中有一個用於NtCreateFile的條目,另一個用於NtReadFile等等 - 請注意NtCreateFileCreateFile不完全相同 - 它是OS內核中發生的部分。

+0

因此,當中斷被觸發時,所有CPU內核都會捕獲它,即使是沒有等待中斷的任何內核。 – 2014-10-20 00:51:55

+0

CPU不是「等待中斷」(儘管如果沒有任何事情可以「停止」CPU,在這種情況下,它會在收到中斷時停止)。只有一個CPU會中斷。通常,APIC被編程爲將中斷提供給特定的CPU。還有「處理器間中斷」,由一個CPU觸發以「呼叫」另一個CPU,調度程序使用該中斷來喚醒停止的CPU,但CPU也可能在中斷髮生時自行喚醒一塊硬件「它負責」。這是一個複雜的問題... – 2014-10-20 07:28:50

+0

@eryksun:謝謝,更新。 – 2014-10-20 07:31:41

相關問題