原創 淺說windows下的中斷請求級IRQL

2022-02-01 08:24:46 字數 1769 閱讀 4177

根據中斷源不同,可以將中斷分為

硬體中斷源又可以分為

通過處理器的intr pin接收的中斷請求,典型地,intr連線到8259a pic上,在支援apic的處理器上,lint0被作為intr連線到外部中斷控制器上

通過local apic產生的本地中斷源

來自晶元組上的i/o apic產生的中斷資訊

在單處理器上,處理器的intr pin接收來自外部8259中斷控制器傳送過來的中斷請求,其位於pci-to-isa bridge(南橋)晶元的lpc控制器裡。

每個8259a pic的ir口都連線著一條irq線。主片的ir0到ir7對應著irq0到irq7線,但是ir2連線著從片的intr pin。從片的ir0到ir7對應著irq8到irq15線。由於從片連線到主片的ir2上,所以從片的ir1同時連線到irq2和irq9。

在8259a中,主片ir0的中斷請求優先順序最高,主片ir7最低,從片ir0-7所有中斷請求優先順序都相當於irq2。所以irq線的優先順序由高到低次序為irq0,irq1,irq8-15,irq3-7。

為了適應多處理器,intel在pentium處理器開始引入了apic(advanced programmable interupt controller)機制。

apic經歷了4個版本,82489dx晶元,apic,xapic,x2apic。xapic共有256個irq線,而x2apic比xapic多了256個,總共512條irq線。

在apci中,每個irq都有各自的優先順序,乙個正在執行的執行緒可能被中斷打斷,進入到中斷處理函式,當遇到優先順序更高的中斷,處在低優先順序的中斷也會被打斷,進入到更高階的中斷處理函式。

windows將中斷的概念進行了擴充套件,提出了中斷請求級的概念,數字低的優先順序高,其中不僅包括了apic的所有中斷,也包括了3個軟體中斷

使用者模式的**執行在最低優先順序passive_level。驅動中的driverentry,派遣函式,adddevice等函式一般執行在passive_level,在必要的時候可申請進入dispatch_level函式。

需要特別注意的是,windows負責執行緒排程的元件是執行在dispatch_level級別,當前的執行緒執行完時間片後,系統自動從passive_level級別提公升到dispatch_level級別。當執行緒切換完畢後,作業系統又從dispatch_level降到passive_level。驅動程式的startio函式和dpc函式也執行在dispatch_level級別。在核心模式,可以通過kegetcurrentirpl核心函式來得到當前的irql級別。

passive_level比dispatch_level低,在實際程式設計中,許多具有比較複雜功能的核心api都要求在passive下執行,而只有比較簡單的api能在dispatch級執行。

在呼叫任何乙個核心api前,必須檢視wdk文件,了解這個核心api的中斷要求

中斷級的簡單判斷方法如何判斷我們正在編寫的**的中斷級呢?暫時可以使用下面規則來處理。

如果當前**執行在dispatch級,而我們又必須呼叫passive級的核心api,使用核心api強制降低當前的中斷請求級是不被允許的,windows的**都執行在規範的中斷級上,任意降低中斷級都會導致不可預料的後果。

這樣的問題有很多種解決方法,比如生成乙個專門的執行緒去執行passive級的**。

淺說時代背景下的軟體技術

軟體工程技術是資訊科技的產物,在網際網路快速發展的背景下,有著廣泛的發展前景。但是在網路開放的背景下,軟體工程技術在使用過程中呈現出安全性低等問題,影響使用效率。基於此,本文就對軟體工程技術的概念進行闡述,並 網路時代背景下軟體工程技術的發展趨勢。一.軟體工程技術的概念分析 軟體工程技術是計算機技術...

Fedora下yum的使用 原創

配置fedora yum 新增rpm fusion源 yum localinstall nogpgcheck 匯入rpm fusion倉庫的金鑰 rpm import 修改金鑰檔案 gedit etc yum.conf 在開啟的檔案尾部新增下面幾行 atrpms name fedora core r...

UCOS環境下的中斷程式

bsp intvectset bsp int id usart1,rfid rxtxisrhandler 設定中斷號 與中斷函式 名稱相匹配。bsp inten bsp int id usart1 使能 中斷號的中斷 rfid rxinten 開啟接收中斷 以下 先說說,幾個關鍵函式 bsp int...