為什麼需要中斷?
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 ...