在linux中,中斷處理程式就是普普通通的c函式,只不過這些函式必須按照特定的型別宣告,以便核心能夠以標準的方式傳遞處理程式的資訊,在其他方面它們與一般的函式沒有什麼不同,中斷處理程式與其他核心函式的真正區別在於中斷處理程式是被核心呼叫來響應中斷的。中斷機制是硬體在需要的時候向cpu發出訊號,cpu暫時停止正在執行的工作,來處理硬體請求的一種機制。
/proc/interrupts這個檔案包含有哪些中斷正在使用和每個處理器各被中斷多少次的資訊
舉例16號
16: 0 198540 0 0 io-apic 16-fasteoi vmwgfx, snd_ens1371
中斷號16的中斷口,在cpu1上響應了198540個中斷,其他三個cpu上響應了0次,鏈結在這個埠的中斷鍊錶上裝置介面是io-apic-fasteoi
這個中斷號是裝置名為 vmwgfx, snd_ens1371的幾個裝置共享的。
每個能夠發出中斷請求的硬體裝置控制器都有一條名為irq的輸出線,所有現有的irq線都與乙個名為可程式設計中斷控制器的硬體電路的輸入引腳相連,可程式設計中斷控制器執行下列動作:
監視irq線,檢查產生的訊號,如果有兩條或兩條以上的irq線上產生了訊號,就選擇引腳編號比較小的irq線。
如果乙個引發訊號出現在irq線上:
返回到第一步。
中斷向量是指中斷發生以後,程式會按照中斷型別執行不同的中斷服務程式,這個中斷向量就是這些中斷處理函式的入口位址的變數。
具體為什麼叫向量,我認為,中斷是有優先順序的,程式會按照優先順序從高到低依次查詢,突出乙個方向性,所以叫向量。
cpu是根據中斷號獲取中斷向量值,即對應中斷服務程式的入口位址值。因此為了讓cpu由中斷號查詢到對應的中斷向量,就需要在記憶體中建立一張查詢表,即中斷向量表(在32位保護模式下該錶稱為中斷描述符表)。80x86微機支援256個中斷,對應每個中斷需要安排乙個中斷服務程式。在80x86實模式執行方式下,每個中斷向量由4位元組組成。這4位元組指明了乙個中斷服務程式的段值和段內偏移值。
計算機記憶體的前1024個位元組(偏移量00000h到003ffh)儲存著256個中斷向量,每個中斷向量佔4個位元組,前兩個位元組儲存著中斷服務程式的入口位址偏移量,後兩個位元組儲存著中斷程式的入口段位址,使用時,只要將它們分別調入暫存器ip及cs中,就可以轉入中斷服務程式實現中斷呼叫。每當中斷發生時,cpu將中斷號乘以4,在中斷向量表中得到該中斷向量位址,進而獲得ip及cs值,從而轉到中斷服務程式的入口位址,呼叫中斷。這就是中斷服務程式通過中斷號呼叫的基本過程。在計算機啟動的時候,bios將基本的中斷填入中斷向量表,當dos得到系統控制權後,它又要將一些中斷向量填入表中,還要修改一部分bios的中斷向量。有一部分中斷向量是系統為使用者保留的,如60h到67h號中斷,使用者可以將自己的中斷服務程式寫入這些中斷向量中。不僅如此,使用者還可以自己更改和完善系統已有的中斷向量。
中斷一般分為非同步中斷(通常由硬體引起)和同步中斷(一般由處理器本身引起)。
**非同步中斷:**cpu處理中斷的時間過長,所以先將硬體復位,使硬體可以繼續自己的工作,然後再使得當時候處理中斷請求中耗時的部分。
網絡卡的工作原理(非同步中斷)
網絡卡收到資料報後,向cpu發出中斷訊號,請求處理接收的的資料報。
cpu將收到的資料報拷貝到記憶體後,即通知網絡卡繼續工作。
至於資料報拷貝到記憶體後的處理會在適當的時候進行。
**同步中斷:**cpu處理完中斷請求的所有工作後才反饋硬體
系統異常處理(比如運算中的除0操作)
應用程式出現異常後,需要核心來處理
核心呼叫相應的異常處理函式來處理異常
處理完後終止應用程式或給出message
實現乙個中斷,主要需要知道3個函式:
註冊中斷的函式,在核心
/*
irg -表示要分配的中斷號
handler -實際的中斷處理程式
flags -標誌位,表示此中斷的具有特性
name -中斷裝置名稱的ascii表示,會被/proc/irg和/proc/interruputs檔案使用
dev -用於共享中斷線,多個中斷程式共享乙個中斷線時(共用乙個中斷訊號),依靠dev來區別各個中斷程式
*/request_irq
(unsigned
int irq, irq_handler_t handler,
unsigned
long flags,
const
char
*name,
void
*dev)
;
中斷處理機制,主要涉及3個函式
do_irq與體系結構有關,對所接收的中斷進行應答
handle_irq_event呼叫中斷線上所有中斷處理
ret_from_intr恢復暫存器,將核心恢復到中斷前的狀態
處理流程如下:
在核心中,中斷開始於預定於入口點,這類似於系統呼叫通過預定於的異常控制代碼進入核心,對於每條中斷線,處理器都會跳到對應的乙個唯一的位置,這樣核心就可知道所接收到的irq號了,初始入口點只是在棧中儲存這個號,並存放當前暫存器的值,然後核心呼叫函式do_irq()。
do_irq()宣告如下:
unsigned int do_irq(struct pt_regs regs)
其中pt_regs結構包含原始暫存器的值,中斷的值也得以儲存,所以do_irq()可以將它提取出來。
接下來,do_irq()需要確保在這條中斷線上有乙個有效的處理程式,而且這個程式已經啟動,但是當前並沒有執行,如果存在該已啟動且尚未執行的處理程式,do_irq()就呼叫handle_irq_event()來執行這條中斷線上所安裝的中斷處理程式。kernel/irq/handle.c
irqreturn_t handle_irq_event
(unsigned
int irq,
struct irqaction *action)
/* * 為這次中斷喚醒處理執行緒,萬一執行緒崩潰且殺死,我們僅僅假裝已經處理了該中斷,上述的硬體中斷處理程式已經禁止裝置中斷,因此杜絕irq的產生。
* storm is lurking.
*/if(
likely(!
test_bit
(irqtf_died,
&action->thread_flags)))
/* fall through to add to randomness */
case irq_handled:
status |
= action->flags;
break
;default
:break;}
retval |
= ret;
action = action->next;
}while
(action);if
(status & irqf_sample_random)
add_interrupt_randomness
(irq)
;local_irq_disable()
;return retval;
}#ifndef config_generic_hardirqs_no__do_irq
#ifdef config_enable_warn_deprecated
# warning __do_irq is deprecated. please convert to proper flow handlers
#endif
中斷上文:硬體通過中斷觸發訊號,導致核心呼叫中斷處理程式,進入核心空間中,硬體的一些變數和引數也要傳遞給核心,核心通過這些引數進行中斷處理,中斷上文可以看著就是硬體傳遞過來的這些引數和核心需要儲存的一些其他環境。
中斷下文:執行在核心空間的中斷服務程式。
中斷上下文具有較為嚴格的時間限制,因為它打斷了其他**。中斷上下文中的**應當迅速、簡潔,盡量不使用迴圈去處理繁重的工作。盡量把工作從中斷處理程式中分離出來,放在下半部來執行,因為下半部可以在更合適的時間執行。
linux基礎知識
舉例來說,硬碟的檔名稱即為 dev hd a d 其中,括號內的字母為 a d 當中的任何乙個,亦即由 dev hda,dev hdb,dev hdc,及 dev hdd 這四個檔案的意思 注 這種型式的表示法在後面的章節當中會使用得很頻繁,請特別留意 那麼光碟機與軟盤呢?分別是 dev cdrom...
Linux基礎知識
檔案系統 分割槽和掛載 linux 檔案系統是乙個檔案樹,它的所有檔案和外部裝置都是以檔案的形式掛結在這個檔案樹上,例如 usr local 目錄結構屬於分割槽 linux 下,分割槽屬於目錄結構。預設檔案系統一般為ext3 ext2的公升級版 分割槽包括主分割槽 擴充套件分割槽 邏輯分割槽和swa...
linux基礎知識
軟體環境 centos release 6.5 final 1 如何使vm虛擬機器上的centos連線到外網?1 把vm虛擬機器上的network connection設定為bridge模式 2 把網絡卡eth0配置資訊中的bootproto設定為dhcp 3 win7的cmd中輸入ipconfig...