解析Windows2000的IDT擴充機制

來源:互聯網
上載者:User

今天我們談談Windows 2000下中斷機制的擴充,首先申明本文提到的技術並非本人發現的,只不過是我在學習Windows核心過程中的一點心得罷了,目的在於為和我一樣剛剛步入Windows底層學習的朋友提供一點實用的資料,同時也順帶記錄下自己的學習過程。如果您是Windows Kernel高手,還望有時間能多多指點一下我們這些晚輩;如果您也是初學者,同樣歡迎到我們FZ5FZ網站來交流探討!那好吧,我們就直接進入正題,如果您對中斷還不怎麼瞭解,那眼前將是一次激動人心的旅程。

1> Windows陷阱機制簡介

陷阱(Trap)是Windows系統中一種不可缺少的系統機制。當系統中發生中斷(硬體中斷或軟體中斷),異常時,處理器會捕捉這個動作,並將系統的控制轉移到一個固定的處理常式處,進行相應的操作處理。在處理器開始處理髮生的中斷或異常前,必須儲存一些處理器環境參數到堆棧中以備系統還原時使用。系統是通過一種稱為陷阱幀(Trap Frame)的方式來實現的,它將系統中全部線程的環境資料儲存到核心堆棧(Kernel Stack)中,在執行完後通過堆棧的出棧機制來恢複系統控制流程程中的執行點。核心中的陷阱機制分為中斷和異常。中斷是系統中隨即發生的非同步事件,與當前系統的處理器狀態無關。同時系統中的中斷可分為可屏蔽中斷和不可屏蔽中斷。而異常則是一種同步事件,在特定情況下異常可以重現,而中斷不可以。中斷又可以分為硬體中斷和軟體中斷。很明顯硬體中斷是與硬體相關的,比如I/O裝置執行的某些操作,處理器時鐘或硬體連接埠上的處理等。軟體中斷則是通過中斷指令int xx引入的,它往往是應用程式在使用者模式執行後進入作業系統的代碼,這時系統為使用者提供了各種各樣的系統服務。比如我們上次提到的系統服務調用(System Service Call),在Windows NT/2000下就是通過軟體中斷int 0x2e(System Service Interrupt)來實現的,雖然在Windows XP/2003下微軟使用了一種稱為“快速系統調用介面”來為使用者提供系統服務,不過大量的中斷服務仍然存在與系統之中的。



2> 中斷處理及其相關流程

此處我們討論的是與特定處理器相關的資料結構,所以會有一些移植方面的問題,本文僅針對Intel的x86 Family處理器,並且本文附帶的程式也只支援在Intel x86處理器上正常執行。何為IDT?IDT(Interrupt Descriptor Table)稱為中斷描述符表。它是可容納8192個單元的數組,數組中的每個成員是稱之為“門”的長度為8位元組的段描述符。在IDT中門可分為三種:中斷門(Interrrupt Gate),陷阱門(Trap Gate)和任務門(Task Gate),但主要的是中斷門和陷阱門。而它們兩者之間也只有少許差別,我們在此只關心IDT中的中斷門,如果您對這方面比較感興趣,請查閱Intel處理器的相關文檔《Intel Architecture Software Developer's Manual,Volume 3》。同時,在系統中存在一個中斷描述符表寄存器(IDTR),它包含了系統中斷描述符表的基地址和IDT的限制資訊,它於一條彙編指令sidt息息相關。在下文中我們將看到它是我們實現各種中斷描述符表擴充的基礎和關鍵!還有一點是需要注意的,在Windows系統中引入了分頁,分段和虛擬儲存機制後,就存在這一種調度機制,將需要執行的代碼和資料調入記憶體,將不需要的資料調到外存(輔助儲存空間,如硬碟等)。如果我們在執行某些代碼時發現了我們需要的資料不在記憶體中時,就會發出一個“缺頁中斷”,這時系統就會在IDT中搜尋這個中斷的ISR(Interrupt Service Routine,插斷服務常式),執行相應的調入工作。大家可以想象如果我們的中斷描述符表被調出到外存後會是什麼樣的結果?那時系統將無法定位“缺頁中斷”的服務常式,至此系統將會崩潰掉!

在中斷描述符表中,我們剛才提到了一個感興趣的寄存器IDTR,當然我們更關心對我們來說更直接的資料:IDT中的程式碼片段選取器(Code Segment Selector),中斷執行代碼的位移量(Offset)和中斷描述符的許可權等級(Descriptor Privilege Level)參數。下面我們看看中斷指令的執行流程,我們應該知道應用程式執行在使用者模式(Ring 3)下,而中斷描述符表則是存在於核心模式(Ring 0)才可以訪問的系統地址空間內的。在軟體中斷髮生後,也就是應用程式調用了某條軟體中斷指令後,處理器首先在IDT中檢索傳入的中斷號參數,找到響應的入口單元後就檢查中斷門的許可權等級參數,看是否允許Ring 3下的應用程式調用,這樣作業系統就為我們保留了對軟體中斷調用控制的權力,然而硬體中斷和異常是不會關注許可權方面的資訊。如果當前許可權等級(Current Privilge Level,CPL)數值大於中斷門描述符需要的許可權(Descriptor Privilege Level),也就是許可權不夠時會引發一個通用保護故障(General Protection Fault),反之則進行處理器的切換從使用者堆棧到核心堆棧。現在是儲存線程環境的時候了,處理器將在使用者模式下的堆棧指標(SS:ESP)和標準的中斷幀(EFLAGS和CS:EIP)壓入堆棧。之後處理器進入我們的插斷服務常式,執行相關的代碼處理後通過彙編指令iretd返回到調用的應用程式。在指令iretd執行時,系統將儲存在堆棧中的線程環境資料出棧還原,待系統復原中斷指令執行前的環境後就接著執行應用程式的後續代碼。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。