上半部中斷不能巢狀,中斷被禁止,**要盡量短,處理一些重要的事情,通常是改變一些標誌狀態
下半部的中斷可以巢狀,有三種處理的方式:
softirq
tasklet
workqueue工作佇列
中斷頂半部函式,禁止中斷,不可巢狀(通過request_irq()申請)
中斷處理函式是被硬體請求執行的核心**,所以它屬於中斷上下文。
在中斷上下文中絕對不允許出現睡眠或者可能睡眠的**,否則會宕機。
睡眠**:ssleep(), msleep()。
可能造成睡眠的**:
kmalloc(2048, gfp_kernel); //記憶體不足時可能睡眠,不能用於中斷中。
kmalloc(2048, gfp_atomic); //記憶體不足時不睡眠,直接返回錯誤碼,可以用在中斷中。
copy_to_user(),copy_from_user(); //可能睡眠,不允許用在中斷中。
使能中斷只能enable_irq().
禁止中斷disable_irq(), 中斷內呼叫disbale_irq_nosync()。
tasklet在linux/interrupt.h中定義,屬中斷上下文,不能訪問0-3g空間,不能用copy_to_user()函式。
工作佇列屬程序上下文,其執行晚於中斷處理函式和tasklet,可休眠。
工作佇列workqueue被程序[events/0] pid=5呼叫。 0為cpu編號
linux核心軟中斷和Tasklet機制
軟中斷 軟中斷的一種典型應用就是所謂的 下半部 bottom half 它的得名來自於將硬體中斷處理分離成 上半部 和 下半部 兩個階段的機制 上半部在遮蔽中斷的上下文中執行,用於完成關鍵性的處理動作 而下半部則相對來說並不是非常緊急的,通常還是比較耗時的,因此由系統自行安排執行時機,不在中斷服務上...
Linux中斷機制
中斷 interrupt 被定義為乙個事件,該事件改變處理器執行的指令順序,這樣的事件與cpu晶元內外部硬體電路產生的電訊號相對應。中斷通常分為同步 synchronous 中斷和非同步 asynchronous 中斷。同步中斷指的是當指令執行時由cpu控制單元產生的,之所以稱為同步,是因為只有在一...
Linux核心 之 中斷
中斷處理函式所作的第一件事情是什麼?答案是遮蔽中斷,所以要遮蔽中斷,是因為新的中斷會再次呼叫中斷處理函式,導致原來中斷處理現場的破壞。因為中斷,它是把原來的上下文都存起來,如果是多級中斷的話,它需要存多級的上下文,除非linux能存多級上下文,感覺是能多存的。如果只能存一級,那必然是要遮蔽中斷,不然...