第3-1章 系統(tǒng)機(jī)制_第1頁
第3-1章 系統(tǒng)機(jī)制_第2頁
第3-1章 系統(tǒng)機(jī)制_第3頁
第3-1章 系統(tǒng)機(jī)制_第4頁
第3-1章 系統(tǒng)機(jī)制_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

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

13陷阱分發(fā)1中斷圖3.1陷阱分發(fā)陷阱處理器中斷服務(wù)例程系統(tǒng)服務(wù)調(diào)用系統(tǒng)服務(wù)硬件異常軟件異常異常分發(fā)器(Exceptionframe)異常幀異常處理器虛擬地址異常虛擬內(nèi)存管理器的換頁器4陷阱分發(fā)相關(guān)概念

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

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

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

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

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

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

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

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

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

x86多處理器系統(tǒng),APIC支持不止200個中斷向量,沒有足夠IRQL來一一對應(yīng),因此HAL按照循環(huán)方式,在設(shè)備IRQL范圍內(nèi),將IRQL分配給中斷向量。

x64和IA64系統(tǒng)HAL將IRQ對應(yīng)的中斷向量除以16的余數(shù)作為其IRQL。13預(yù)定義IRQL

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

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

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

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

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

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

1_1

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

溫馨提示

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

最新文檔

評論

0/150

提交評論