新聞中心
Linux操作系統的使用越來越廣泛,因為它具有優(yōu)秀的穩(wěn)定性、安全性和開放性,而且在嵌入式系統、服務器等領域也有廣泛的應用。在Linux中,中斷是相當重要的成分之一,以便在保證系統響應速度和效率的同時,能夠處理外設的數據和信號。IRQ(Interrupt Request,中斷請求)是一種方式,可以通過向CPU發(fā)送請求,并暫停主處理器,進行一些臨時的時間敏感操作,如輸入輸出和其他設備操作。IRQ描述符機制是Linux中處理中斷請求的重要機制之一。讓我們來深入了解一下Linux中的irq desc機制吧。

創(chuàng)新互聯專注于企業(yè)全網整合營銷推廣、網站重做改版、志丹網站定制設計、自適應品牌網站建設、H5技術、購物商城網站建設、集團公司官網建設、成都外貿網站制作、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為志丹等各大城市提供網站開發(fā)制作服務。
1. 簡介
irq desc指的是中斷事件的描述符(描述符是用于管理資源的抽象基本單元)。在Linux內核中,用一個專門的機制來處理中斷,降低系統性能消耗的同時保證了中斷的準確性和高效性。內核把硬件中斷源映射到一個軟中斷之后,再由軟中斷處理程序進行進一步處理。這個過程中有一些數據結構主要有irq_desc、irq_chip和irq_domn,其中irq_desc是中斷描述符。
2. 中斷處理的優(yōu)化
Linux內核為了滿足高性能和低延遲的需求,對中斷和中斷處理進行了優(yōu)化。主要包括兩個方面:
(1)中斷共享
當多個設備同時發(fā)送中斷請求時,內核可以選擇使用共享的方式,只需要把所有的中斷源映射到一個軟中斷即可。這樣不僅可以減少中斷向量的占用,還可以減少CPU時間的浪費,從而提高系統的效率。
(2)中斷波動處理
中斷可能會因為某些不可預知的原因而出現波動。這時候,如果每一個中斷事件都去喚醒CPU的話,那么處理器的效率就會被大大降低。為了防止這種情況發(fā)生,Linux內核采用一種稱為中斷波動處理的機制,可以在一定周期內進行檢查,該周期叫做IRQ Stormreshold。
3. 中斷描述符機制
在Linux內核中,中斷和中斷處理是通過中斷描述符進行管理和調度的。當硬件產生中斷信號的時候,中斷系統將生成一個中斷描述符,其中包含了中斷控制器在處理特定中斷時的所有相關信息。Linux中斷描述符結構體(irq_desc)如下:
“`
struct irq_desc {
struct irq_common_data irq_common_data;
struct irq_data irq_data;
#ifdef CONFIG_GENERIC_IRQ_PROBE
struct device_node *of_node;
#endif
struct irq_chip *chip;
struct irq_desc *parent_irq;
struct module *owner;
const char *action_name;
#ifdef CONFIG_PROC_FS
struct proc_dir_entry *dir;
#endif
unsigned int yield_flags;
};
“`
其中,irq_common_data為公共中斷信息,irq_data為通用中斷處理程序所需的硬件描述,chip為處理硬件的架構依賴代碼的指針,owner表示中斷描述符所屬的模塊,action_name為中斷名稱,yield_flags表示是否已經被喚醒過。
4. 中斷和處理程序的注冊
當一個中斷事件發(fā)生時,它將發(fā)出一個中斷請求,并映射到中斷描述符上。中斷處理程序可以在系統內核中注冊,它的任務是在中斷事件發(fā)生時盡快被調用,以處理該事件。在內核中可以使用request_irq()函數對中斷進行注冊,它的聲明如下所示:
“`
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev);
“`
其中,irq參數是中斷編號,handler是中斷處理函數,flags為一個中斷標志位,name是中斷描述符的名稱,dev是一個指向實例的指針。
5. 中斷處理函數的執(zhí)行過程
當某個中斷發(fā)生時,對應的硬件將向處理器發(fā)送信號,處理器會暫停正在執(zhí)行的工作,并跳轉到與該中斷相應的中斷處理程序。中斷處理程序執(zhí)行并完成特定的操作之后,將恢復主處理器的執(zhí)行。中斷處理函數內包含的操作應該是盡可能簡短、絕不進行復雜計算或大量I/O操作的程序。在執(zhí)行中斷處理程序時,它可以從IRQ_DESC狀態(tài)中判斷該中斷是否已經被處理過,以便消除重復執(zhí)行。
6.
irq desc機制是Linux中處理中斷請求的重要機制之一,它可以保證系統的性能和穩(wěn)定性。中斷處理函數的執(zhí)行過程伴隨著中斷描述符的注冊以及一些其他的優(yōu)化策略,如中斷共享和中斷波動處理。在系統設計和開發(fā)中,有必要深入了解其中的機制和原理,以便為系統的性能和效率提供更好的保障。
相關問題拓展閱讀:
- Linux如何及時響應外部中斷
- 請教linux irq 中斷能使用mutex互斥鎖嗎
Linux如何及時響應外部中斷
FPGA每隔100us給運行l(wèi)inux的ARM一個中斷,要求在20us內響應中斷,并讀走2023*16bit的數據。
目前主要的問題是,當系統同時發(fā)生多個中斷時,會嚴重影響linux對FPGA中斷的響應時間。如何解決?
1、首先想到了ARM的FIQ,它可以打斷IRQ中斷服務程序,保證對外部FIQ的及時響應。但是發(fā)現linux只實現了IRQ,沒有顯示FIQ。
linux是從devicetree讀取中斷號,加入中斷向量表的。
interrupts = ;中的之一個字段0表示非共享中斷,非零表示共享中斷,SDK產生的dts統一為0,此時第二字段的值比XPS中的小32;如果之一字段非零,則第二字段比XPS小16.
最后字段表示中斷的觸發(fā)方式。
IRQ_TYPE_EDGE_RISING =0x,
IRQ_TYPE_EDGE_FALLING =0x,
IRQ_TYPE_LEVEL_HIGH =0x,
IRQ_TYPE_LEVEL_LOW =0x,
很明顯,devicetree根本沒有提供通知linux有FIQ的渠道。
2、再來看linux的IRQ
linux的中斷分為上半部清伏和下半部,上半部運行在IRQ模式,會屏蔽所有中斷,下半部運行在SVC模式,會重新打開中斷。
也就是說,當一個中斷的上半部正在運行時(不能再次響應中斷),FPGA的中斷是不能被linux響應的;
反過來,當FPGA中斷的上半部正在運行時(不能再次響應中斷),其他的中斷也不能被linux響應;
unsigned long flags;
…
local_irq_save(flags);
….
local_irq_restore(flags);
3.
ARM有七種模式,我們這里只討論SVC、IRQ和FIQ模式。
我們可以假設ARM核心有兩根中斷引腳(實際上是看不見的),一根叫 irq pin, 一根叫fiq pin.
在ARM的cpsr中,有一個I位和一個F位,分別用來禁止IRQ和FIQ的。
先不說中斷控制器,只說ARM核心。正常情況下,ARM核都只是機械地隨著pc的指示去做事情,當CPSR中的I和F位為1的時候,IRQ和FIQ全部處于禁止狀態(tài)。無論你在irq
pin和fiq pin上面發(fā)什么樣的中斷信號,ARM是不會理你的,你根本不能打斷他,因為他耳聾了,眼也瞎了。
在I位和F位為0的時候,當irq
pin上有中斷信號過來的時候,就會打斷arm的當前工作,并且切換到IRQ模式下,并且跳到相應的異常向量表(vector)位置去執(zhí)行代碼。這個過程是自動的,但是返回到被中斷打斷的地方就得您親自動手了。當你跳到異常向量表,處于IRQ的模式的時候,這個時候如果irq
pin上面又來中斷信號了,這個時候ARM不會理你的,irq
pin就跟秘書一樣,ARM核心就像老板,老板本來在做事,結果來了一個客戶,秘書打斷它,讓客戶進去了。而轎櫻這個時候再來一個客戶,要么秘書不斷去敲門問,要么客戶走人。老板之一個客戶沒有會見完,是不會理你的。
但是有一種情況例外,當ARM處在IRQ模式,這個時候fiq pin來了一個中斷信號,fiq
pin是什么?是快速中斷呀,比如是公安局的來查刑事案件,那才不管你老板是不是在會見閉正叢客戶,直接打斷,進入到fiq模式下,并且跳到相應的fiq的異常向量表處去執(zhí)行代碼。那如果當ARM處理FIQ模式,fiq
pin又來中斷信號,又就是又一批公安來了,那沒戲,都是執(zhí)法人員,你打不斷我。那如果這個時候irq
pin來了呢?來了也不理呀,正在辦案,還敢來妨礙公務。
所以得出一個結論: IRQ模式只能被FIQ模式打斷,FIQ模式下誰也打不斷。
在打不斷的情況下,irq pin 或 fiq pin隨便你怎么發(fā)中斷信號,都是白發(fā)。
所以除了fiq能打斷irq以外,根本沒有所謂中斷嵌套的情況。
Linux不用FIQ,只用到了IRQ。但是我們有時候一個中斷需要處理很長時間,那我們就需要占用IRQ模式那么長的時間嗎?沒有,linux在IRQ模式下只是簡單的記錄是什么中斷,馬上就切換回了SVC模式,換句話說,Linux的中斷處理都是在SVC模式下處理的。
只不過SVC模式下的ISR上半部關閉了當前中斷線,下半部才重新打開
請教linux irq 中斷能使用mutex互斥鎖嗎
從 Backtrace 來看,應該是 i2c_transfer 中調用 mutex_lock 導致 schedule 調用而產生 進程調度,導致死機. 而嘩運在中斷上下文,這種情況亂好梁是絕對不允許發(fā)生的.換句襪洞話說是不允許
睡眠的,不允許進程調度.
你可以 把 mutex_lock 注釋掉再試試?。?/p>
關于linux irq desc的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
香港服務器選創(chuàng)新互聯,2H2G首月10元開通。
創(chuàng)新互聯(www.cdcxhl.com)互聯網服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網站系統開發(fā)經驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。
網站標題:深入了解Linux中的irqdesc機制(linuxirqdesc)
網頁地址:http://www.dlmjj.cn/article/dhehocj.html


咨詢
建站咨詢
