核心中斷過程

2022-04-03 00:23:41 字數 2282 閱讀 3199

為什麼需要中斷?

1)外設的處理速度一般慢於cpu

2)cpu不能一直等外部事件

所以裝置必須有一種方法來通知cpu它的工作進度,這就是中斷。

在linux驅動程式中,為裝置實現乙個中斷

步驟:1)向核心註冊中斷

2)實現中斷處理函式

cpu如何識別中斷:

在intel x86中可以支援256中向量中斷,為了使處理器能使別每種中斷源,給它們進行了編號----->叫做中斷向量 

這些中斷向量在linux中的分配:

1)編號0~31的向量對應於異常和非遮蔽中斷

2)編號32~47的向量(即由io裝置引起的中斷)分配給遮蔽中斷。

3)編號48~255的向量用來標示軟中斷。

linux用其中的128或0x80來實現系統呼叫, 非遮蔽中斷的向量和異常的向量是固定的。

異常和中斷的區別:

1)異常:是指cpu內部出現的中斷,即在cpu執行特定指令時出現的非法情況。同時異常也稱為同步中斷,因此只有在一條指令執行後才會發出中斷 ,不可能在指令執行期間發生異常。

a.產生的原因:

程式的錯誤產生的(eg:除數為0)

核心必須處理的異常條件產生的(eg:缺頁)

b.異常又分為故障和陷阱,它們都不使用中斷控制器,也不能被遮蔽

c. x86處理處理器中大約有20中異常。linux核心必須為每種異常提供乙個專門的異常處理程式。

2)中斷:也稱為非同步中斷。因此它是由其他硬體裝置依照 cpu 時鐘訊號隨機產生,即意味著中斷能在指令之間發生。

a.中斷又分為外部可遮蔽中斷(intr)和外部非遮蔽中斷(nmi)

所用i0裝置產生的中斷請求均引起可遮蔽中斷

硬體故障引起的故障則產生非遮蔽中斷。

說明:在cpu執行乙個異常處理程式時,就不再響應其他異常和中斷請求服務.那麼如果此時發生了乙個異常,cpu不能去響應它,又不能把它的資訊丟失該怎麼辦呢?

這是就用到了堆疊,把所有的資訊壓入棧。等當前異常處理後,才從堆疊中取出資訊再響應剛才的異常。(當產生多個非遮蔽中斷時,cpu的處理方法同上)

中斷註冊

int request_irq ( unsigned int irq, void (*handler)(int, void*, struct pt_regs *)

, unsigned long flags , const char *devname , void *dev_id )

返回0表示成功,或者返回乙個錯誤碼

引數:irq:中斷號

handler:中斷處理函式 指標

flags:與中斷管理有關的各種選項

devname:裝置名

dev_id:共享中斷時使用

在flags引數中,可以選擇一些與中斷管理有關的選項

如:irqf_disabled(sa_interrupt)

如果設定該位,表示是乙個「快速」中斷處理程式

如果沒有,表示是乙個「慢速」中斷處理程式

irqf_shared(sa_shirq)

該位表示中斷可以在裝置間共享

快速中斷不允許中斷巢狀(不被打斷)

慢速中斷可以中斷巢狀,其它型別的中斷可以得到服務(預設)

dev_id,共享中斷

共享中斷就是將不同的裝置掛到同乙個中斷訊號線上。

linux對共享的支援主要是為pci裝置服務

共享中斷也是通過request_irq函式來註冊的,但有三個特別之處:

1)申請共享中斷時,必須在flags引數中指定irqf_shared位

2)dev_id引數必須是唯一的

為什麼要唯一?

在釋放中斷時要void free_irq()不然核心不知道你要釋放哪個裝置(共享中斷時有不只乙個裝置在用這個中斷)

3)不能使用disable_irq(unsigned int irq)(這個函式是禁止中斷的)

為什麼?

如果使用了,共享中斷訊號線的裝置同樣無法使用中斷,也就是無法正常工作了。

中斷處理程式

中斷處理程式是中斷上下檔案中執行的,所以它的行為受到某些限制:

1)不能向使用者空間傳送或者接受資料

2)不能使用可能引起阻塞的函式

3)不能使用可能引起排程的函式

中斷函式實現流程:

void short_sh_interrupt(int irq, void *dev_id, struct pt_regs *regs)

釋放中斷

void free_irq(unsigned int irq, void *dev_id);

IRQ中斷過程

請問irq中斷過程是怎樣的?問題 irq中斷過程 回答 標準中斷步驟 irq 1 aic已經正確程式設計,aic svr也已經寫入正確的中斷服務程式的入口位址。且中斷已經使能 2 位址0x18 irq的中斷向量位址 的指令為 ldr pc,pc,f20 當nirq到來,且cpsr的i位為0時,步驟如...

cortex m3核心中斷

m3核心中有乙個r w 中斷暫存器陣列 該陣列記錄了外部從0到239個中斷的名字pri 0 239,中斷暫存器位址,中斷的優先順序 8位,stm32用了其中的高4位,復位之後是0 如下 另外還有乙個應用中斷控制與復位暫存器r w aircr 這裡面記錄了優先順序分組方法 10 8 對應著前面陣列暫存...

Linux 核心中斷體系 初探

還是要先理解整個中斷的體系,首先要理解對中斷的含義 如果這是涉及到的軟體的除錯的話,沒有接觸過硬體的同學會對,gdb的除錯中的中斷有一定的認知 但是,這兩個中斷指的意思是不相同的,gdb的除錯中的中斷 指的是程式執行到某個節點的的時候就跳出程式,這個 節點指的是提前設定好的中斷點,而這個linux ...