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

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


咨詢
建站咨詢
