第3-1章 系統機制_第1頁
第3-1章 系統機制_第2頁
第3-1章 系統機制_第3頁
第3-1章 系統機制_第4頁
第3-1章 系統機制_第5頁
已閱讀5頁,還剩19頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第三章Windows系統機制3.1陷阱分發包括中斷分發、延遲的過程調用DPC、異步過程調用APC,異常分發,系統服務分發。3.2執行體對象管理器3.3同步。自旋鎖、內核分發器對象,等待實現。3.4系統輔助線程。3.5Windows全局標志。3.6本地過程調用3.7內核事件跟蹤。3.8Wow64。13.1、陷阱分發中斷InterruptCPU暫停當前程序,保留現場后自動轉去處理相應事件,處理完后,到適當時候返回斷點,繼續完成被打斷的程序。異常ExceptionCPU執行特殊指令,當前線程轉入特殊處理代碼,由它決定下一步的程序流向。陷阱trap當異常或者中斷發生時,處理器捕獲到一個執行線程,并且將控制權轉移到操作系統中某個固定地址處。Windows中,處理器將控制權轉給一個陷阱處理器。陷阱處理器traphandler指與某個特殊中斷或異常關聯的函數。2內核區別對待中斷和異常。中斷是一個異步事件,異常是一個同步條件。中斷可以在任何時候發生,中斷與處理器當前任務毫無關系,在同樣條件下用同樣數據運行程序,中斷不會重現。異常是一個特殊指令執行的結果,同樣條件下用同樣數據再次運行程序可以重現異常。中斷主要由I/O設備、處理器時鐘或定時器產生,可以被允許、可以被禁止。異常例子有:內存訪問違例、特定的調試器指令、除零錯誤。陷阱分發——中斷與異常的區別

13陷阱分發1中斷圖3.1陷阱分發陷阱處理器中斷服務例程系統服務調用系統服務硬件異常軟件異常異常分發器(Exceptionframe)異常幀異常處理器虛擬地址異常虛擬內存管理器的換頁器4陷阱分發相關概念

1陷阱幀trapframe是一個線程完整執行環境的一個子集,用dtnt!_ktrap_frame命令可查看陷阱幀的定義。中斷服務例程ISR,interruptserviceroutine由設備驅動程序提供給中斷設備的處理例程。硬件和軟件都可產生中斷和異常(總線錯誤異常、除零異常)。硬件異常或中斷發生,處理器用內核棧記錄機器狀態信息供返回。若線程是用戶模式,則Windows切換到該線程的內核模式棧,然后在被中斷線程的內核棧創建一個陷阱幀以保存狀態。多數情況,內核安裝了前端陷阱處理函數用來執行常規陷阱處理任務。若陷阱條件是設備中斷,則內核硬件中斷陷阱處理器將控制權交給ISR;若陷阱條件是調用系統服務引發,則通用系統服務陷阱處理器將控制權交給執行體中指定的系統服務函數。陷阱處理器,通常執行系統函數KeBugCheckEx,當內核檢測到可能導致數據破壞的問題行為或不正確行為時,停止計算機。5中斷分發

1硬件中斷往往是由I/O設備激發中斷驅動的設備使得操作系統可交替進行中心處理和I/O操作,最大限度發揮處理器能力。比如:定點設備、打印機、鍵盤、磁盤驅動器和網卡。系統軟件可能產生中斷內核可激發一個軟件中斷來觸發一個線程分發,同時以異步方式打斷一個線程的執行。內核可禁止中斷,從而處理器不會被中斷,只有在個別情況關鍵時候——如處理器正在處理一個中斷,或正在分發一個異常。中斷陷阱處理器InterruptTrapHandler內核安裝中斷陷阱處理器來響應設備的中斷。ITH將控制權或者傳遞給一個負責處理該中斷的外部例程(ISR),或者傳遞給一個響應該中斷的內部內核例程。設備驅動程序提供了ISR來處理設備中斷;內核為其它類型的中斷提供中斷處理例程。6硬件中斷處理

1_1中斷請求IRQ、中斷分發表IDT、中斷控制器IC外部I/O中斷進入中斷控制器的某一根線,該中斷控制器IC在一根線上中斷處理器。處理器被中斷時,將詢問控制器以獲取中斷請求(IRQ,Interruptrequest)。IC將該IRQ轉譯為一個中斷號,用此號碼作為中斷分發表(IDT,interruptdispatchtable)的索引,且將控制權傳遞給恰當的中斷分發例程。系統引導時,Windows會填充IDT,IDT包含了指向內核中負責處理每個中斷和異常的例程的指針。內核調試命令!IDT可以查看IDT的內容Windows將硬件IRQ映射到IDT中的中斷號上,也用IDT來為異常配置陷阱處理器。例如IDT中0xe這項指向系統的頁面錯誤處理器。Windows最多支持256個IDT項,具體數目由主機的中斷控制器決定。每個處理器有單獨的IDT,可運行不同的ISR。在多處理器系統中,所有處理器都接收時鐘中斷,只有一個處理器的中斷響應將更新系統時鐘。一個線程的時限quantum結束時,通過該中斷發起重新調度過程。7中斷控制器

1_1x86中斷控制器絕大多數x86系統,或者用i8259A可編程中斷控制器(PIC),或者用i82489高級可編程中斷控制器(APIC)。PIC只能用于單處理器,有15條中斷線;APIC和SAPIC可用于多處理器,有256條中斷線。APIC可兼容單處理器系統。APIC構成:一個專門接收設備中斷的I/OAPIC,一些本地APIC,和一個與i8259A兼容的中斷控制器。I/OAPIC中斷轉送算法由HAL來選擇。x64中斷控制器x64體系結構與x86兼容,但Windows64版本必須使用APIC。IA64中斷控制器IA64體系結構依賴于改進的高級可編程中斷控制器(SAPIC)。I/OAPIC使用一條私有APIC總線遞交中斷給本地APIC;SAPIC系統,中斷通過I/O和系統總線實現更快速遞交。內核調試器命令!pic、!apic、!ioapic查看配置。8軟件中斷請求級別(IRQL)

1_1中斷請求級別(IRQL,interruptrequestlevel)。x86系統使用0至31;x64和IA64使用0至15。數值越大優先級越高。高端電源失敗處理器間的中斷時鐘性能剖析設備n┇設備1DPC/dispatchAPC被動3130292827263210硬件中斷軟件中斷普通線程在這一級別運行圖3.3x86中斷請求級別(IRQL)高端/性能剖析處理器間的中斷/電源時鐘同步(Server2003版本)設備n┇設備1Dispatch/DPCAPC被動/低端151413121143210高端/性能剖析/電源處理器間的中斷時鐘同步(僅限多處理器版本)設備n┇設備1可糾正的機器檢查Dispatch/DPC&同步APC被動/低端x64IA64圖3.4x64和IA64中斷請求級別(IRQL)9軟件中斷請求級別(IRQL)

1_1中斷按照優先級處理,高優先級中斷會搶占執行權。高優先級中斷發生,處理器保存被中斷線程狀態,并調用該中斷關聯的陷阱分發器,該分發器提升IRQL并調用該中斷的服務例程。服務例程完成后,中斷分發器再降低處理器的IRQL,回到中斷發生之前的級別,然后裝入被保存的機器狀態,被中斷線程恢復運行。當內核降低了IRQL,被屏蔽的低優先級中斷可能出現。調度優先級是線程的一個屬性,而IRQL是中斷源(如鍵盤和鼠標)的一個屬性。每個處理器有一個隨操作系統代碼執行而變化的IRQL設置,IRQL設置決定了可以接收哪些中斷。內核模式線程,通過調用KeRaiseIrql和KeLowerIrql函數的直接方式,或者通過調用那些獲取內核同步對象的函數的間接方式,提升或降低處理器的IRQL。若中斷源的IRQL等于或低于處理器當前的級別,則中斷被屏蔽(mask),直到有一個執行線程降低IRQL級別為止。10軟件中斷請求級別(IRQL)

1_1延遲IRQL。 因訪問PIC較慢,故使用PIC的HAL實現了性能優化(延遲IRQL),避免訪問PIC。當IRQL被提升,HAL內部記錄新IRQL,中斷屏蔽值不變。若隨后發生更低優先級中斷,則HAL將中斷屏蔽值設置來適合第一個中斷,并使更低優先級中斷延遲至IRQL降低下來。若IRQL提升時無更低優先級中斷,則HAL不需要修改PIC。升降IRQL。 內核模式線程根據需要來提升或降低所在處理器的IRQL。當中斷發生,陷阱處理器(或處理器本身)將該處理器的IRQL提升至中斷源的IRQL,暫時屏蔽同一處理器上非更高優先級中斷。被屏蔽中斷或者被其它處理器處理,或者保留至當前處理器的IRQL降下來。查看IRQL。 !irqlkd>!irqlDebuggersavedIRQLforprocessor0x0--0(LOW_LEVEL)11中斷映射(IRQL)

1_1PCR和PRCB。 處理器控制區(PCR,processorcontrolregion)和(擴展)處理器控制塊(PRCB,processorcontrolblock)有一個IRQL域。兩個數據結構包含每個處理器狀態信息:當前IRQL、指向硬件IDT指針、當前線程、下一個將運行的線程。內核和HAL利用處理器狀態信息來執行與體系結構或與機器相關的動作。詳細信息見DDK文檔Ntddk.h。用戶模式線程對應的IRQL。 用戶模式線程不能改變處理器的IRQL,此時IRQL總是被動級別。只有處理器執行內核模式代碼時,處理器的IRQL才可能更高。將中斷映射到IRQL。 IRQL級別與中斷控制器定義的中斷請求IRQ不同。Windows通過HAL決定各中斷分配的IRQL。總線型驅動程序負責確定總線(PCI、USB等)有哪些設備,哪些中斷可分配給某設備,并將此信息匯報給即插即用管理器。即插即用管理器考慮所有設備可接受的中斷分配方案后,確定每個設備分配哪個中斷,然后調用HAL函數HalpGetSystemInterruptVector,將中斷映射到對應的IRQL。12中斷分配算法

1_1中斷分配算法。 單處理器x86系統HAL直接翻譯:用27減去中斷向量值,就是它的IRQL。例如設備的中斷向量值為5,則它的ISR在IRQL22上執行。

x86多處理器系統,APIC支持不止200個中斷向量,沒有足夠IRQL來一一對應,因此HAL按照循環方式,在設備IRQL范圍內,將IRQL分配給中斷向量。

x64和IA64系統HAL將IRQ對應的中斷向量除以16的余數作為其IRQL。13預定義IRQL

1_1只有內核在KeBugCheckEx中停止了系統并屏蔽了所有中斷,內核才會使用高級別的IRQL。電源失敗級別。 最初出現在WindowsNT原始設計文檔,指定系統電源失敗代碼行為,但從未被真正用到。處理器間中斷級別。 被用于向另一個處理器請求執行一個動作。如將一個dispatch_level中斷排到隊列中,以便調度特定線程執行其任務、更新處理器地址轉換快查緩沖區(TLB,translationlook-asidebuffer)的高速緩存、系統關閉或者系統崩潰。時鐘級別。 主要用于系統的時鐘,內核利用該中斷級別來跟蹤具體的時刻,為線程測量或分配CPU時間。14預定義IRQL

1_1性能剖析profile級別。 當內核性能剖析功能被打開,系統的實時時鐘就會用到性能剖析級別。內核虛擬剖析陷阱處理器會記錄中斷發生時被執行代碼地址。隨時間推移,將建立一張地址采樣表,供有關工具提取相應信息進行分析。可從/whdc/system/sysperf/krview.mspx下載一個內核虛擬剖析工具kernrate,來配置和查看性能的統計量。設備IRQL。 被用來對設備中斷進行優先級區分(將硬件中斷映射到IRQL,參見前面第12面)。DPC/Dispatch級別和APC級別。 由內核和設備驅動程序產生的軟件中斷(后面將詳細解釋)。被動級別。 最低的IRQL,實際上根本不是一個中斷級別;它是普通線程運行時的設置,此時所有中斷都允許發生。15高級代碼的限制

1_1 運行在DPC/Dispatch級別或更高級別上的代碼,一個重要限制是它不能等待一個對象。 另一個限制是,在DPC/Dispatch級別或更高級別的IRQL上,只能訪問非換頁的內存。原因在于調度器在DPC/Dispatch級別上和它的數據結構同步,因此它不能被調用來執行重新調度的操作。如果違反這兩個限制,系統就會崩潰,其崩潰代碼為IRQL_NOT_LESS_OR_EQUAL。在設備驅動程序中,違反這些限制是一種常見錯誤(Windows驅動程序檢驗器有一個選項,設置該選項后可以幫助找到這種特定類型的錯誤)。16中斷對象

1_1 內核提供一種可移植機制使得設備驅動程序可以為設備注冊ISR,此即中斷對象——內核控制對象。中斷對象包含所有“供內核將一個設備的ISR與一個特定級別中斷關聯所需”的信息,包括該ISR地址、該設備中斷時所在的IRQL級別,以及內核中與該ISR關聯的IDT項。 一個中斷對象初始化時,少量的匯編語言代碼指令(稱為分發代碼)被從一個中斷處理模板KiInterruptTemplate中拷貝來,保存在該對象中。中斷發生時,這些代碼將被執行。這份駐留于中斷對象的代碼調用了實際的中斷分發器,通常為KiInterruptDispatch或KiChainedDispatch例程,并將指向該中斷對象的指針傳遞給它。前者只適用于僅注冊一個中斷對象的中斷向量,后者則在多個中斷對象之間共享中斷向量。中斷對象包含信息使得分發器例程能找到并正確調用設備驅動程序的ISR,同時包含與該中斷關聯的IRQL,故上述兩個例程調用ISR之前將IRQL提升級別,在ISR返回之后再降低IRQL。多處理器系統,內核為每個CPU分配一個中斷對象并初始化,使該CPU上的本地APIC能夠接受特定的中斷。17中斷控制流

1_1 中斷控制流外圍設備控制器CPU中斷控制器CPU中斷分發表012nISR地址自旋鎖分發代碼——————————提升IRQL抓住自旋鎖—————放掉自旋鎖降低IRQL———————————————從設備讀取數據—————確認中斷請求DPC——————————中斷對象KiInterruptDispatch驅動程序的ISR圖3.6 典型的中斷控制流18檢查中斷內部

1_1首先,用命令!idt查看中斷分發表。31:8a39dc3ci8042prt!I8042KeyboardInterruptService(KINTERRUPT8a39dc00)檢查該中斷關聯的中斷對象內容,執行dtnt!_kinterrupt命令kd>dtnt!_kinterrupt8a39dc00nt!_KINTERRUPT +0x000 Type :22 +0x002 Size :484 … +0x028 Irql :0x1a‘‘ …此例,Windows分配給該中斷的IRQL是0x1a(十進制26)。19連接和斷開中斷對象

1_1

將一個ISR與某個特定中斷級別關聯起來,此操作稱為連接一個中斷對象。將一個ISR與IDT項斷開關聯,則稱為斷開一個中斷對象。這些都是通過調用內核函數IoConnectInterrupt和IoDisconnectInterrupt來完成,正是這兩個操作,使得設備驅動程序可在加載到系統中時“打開”一個ISR;在卸載驅動程序時,可以“關閉”該ISR。中斷對象好處使用中斷對象注冊一個ISR,可避免設備驅動程序直接操縱中斷硬件,可不必知道該IDT細節。該內核特性利于創建可移植的設備驅動程序(無需匯編編碼、無需反映處理器差異)。通過使用中斷對象,內核可將該ISR的執行過程與設備驅動程序中其它可能與ISR共享數據的部分同步起來。中斷對象使得內核很容易為任何一個中斷級別調用多個ISR。若多個設備驅動程序創建中斷對象,并將它們連接到同一個IDT項,則指定中斷線發生中斷時,中斷分發器會調用每個例程。如果

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論