導航:首頁 > 操作系統 > linux中斷屏蔽

linux中斷屏蔽

發布時間:2023-02-07 17:52:50

linux如何保護共享資源

主要有一下幾種:中斷屏蔽、 原子操作、自旋鎖、信號量、環形緩沖區。在本文中對於這些機制的具體的實現函數,以及原理不再做任何的表述。本 一、原子變數 假設我們所需要保護的共享資源只是一個整數值,此時我們可以採用的機制有自旋鎖,信號量,和原子變數,當然中斷屏蔽也是可以的。但是如果選擇最優的機制,我們應該選擇原子變數。原因:1.對一個整數值的操作是很簡單的,也就是說此對全局變數形成的臨界區是很小的.如果我們採用其他的機制,例如鎖的機制,信號量等就顯得有些浪費.也就是說,你的鎖機制的代碼量可能比臨界區的代碼量還要多.2. 對一個缺乏經驗的程序員來講,由於思維缺乏邏輯,使用鎖機制會存在很多潛在的風險.例如: 死鎖.等問題;而採用原子變數的方法,可以避免鎖機制產生的弊端. 二、自旋鎖自旋鎖機制和信號量機制都可以對資源進行互斥訪問,但是從性能上講,自旋鎖的性能優於信號量。但是自旋鎖機制本身在不停的自旋(也就是查詢鎖是否可用),導致此機制有一些缺點:1。假定我們的驅動程序獲得了一個自旋鎖,在臨界區開始了他的工作期間,驅動程序丟掉了處理器。也許他調用了一個函數,這個函數使進程休眠。也許發生了內核的搶占。但是我們的代碼擁有這個自旋鎖,如果其他的進程想要獲得此自旋鎖,需要等很長時間,甚至造成死鎖。所以我們應用自旋鎖時應遵循:任何擁有自旋鎖的代碼必須是原子的。所以他不能休眠,所以不能調用能夠引起休眠的函數。例如:_to_user,_from_user,kmalloc等。也不能因為任何原因放棄處理器,除了中斷以外(有時中斷也不行,可以採用禁止中斷的自旋鎖函數操作)。 三、信號量擁有信號量的進程是可以休眠的。這也正是他對於自旋鎖的優勢。 其他的暫不論述。

❷ linux下 軟中斷處理函數do_softirq中用了local_irq_disable()來屏蔽中斷

中斷屏蔽,確實會導致中斷丟失。但是,中斷控制器本身會保證中斷不被丟失。對於水平觸發中斷,一個中斷發送出去,如果沒有cpu的ack,會一直懸停在那,直到相應為止。一個邊緣觸發的中斷,是設計成可以丟失的中斷,丟失了也無所謂。因為中斷控制器會重發。

對於網路數據中的大量中斷,有NAPI的方式來實現。

❸ Linux如何及時響應外部中斷

FPGA每隔100us給運行linux的ARM一個中斷,要求在20us內響應中斷,並讀走2000*16bit的數據。
目前主要的問題是,當系統同時發生多個中斷時,會嚴重影響linux對FPGA中斷的響應時間。如何解決?

1、首先想到了ARM的FIQ,它可以打斷IRQ中斷服務程序,保證對外部FIQ的及時響應。但是發現linux只實現了IRQ,沒有顯示FIQ。
linux是從devicetree讀取中斷號,加入中斷向量表的。

interrupts = <0x0 0x32 0x0>;中的第一個欄位0表示非共享中斷,非零表示共享中斷,SDK產生的dts統一為0,此時第二欄位的值比XPS中的小32;如果第一欄位非零,則第二欄位比XPS小16.
最後欄位表示中斷的觸發方式。
IRQ_TYPE_EDGE_RISING =0x00000001,
IRQ_TYPE_EDGE_FALLING =0x00000002,
IRQ_TYPE_LEVEL_HIGH =0x00000004,
IRQ_TYPE_LEVEL_LOW =0x00000008,
很明顯,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全部處於禁止狀態。無論你在irq
pin和fiq pin上面發什麼樣的中斷信號,ARM是不會理你的,你根本不能打斷他,因為他耳聾了,眼也瞎了。
在I位和F位為0的時候,當irq
pin上有中斷信號過來的時候,就會打斷arm的當前工作,並且切換到IRQ模式下,並且跳到相應的異常向量表(vector)位置去執行代碼。這個過程是自動的,但是返回到被中斷打斷的地方就得您親自動手了。當你跳到異常向量表,處於IRQ的模式的時候,這個時候如果irq
pin上面又來中斷信號了,這個時候ARM不會理你的,irq
pin就跟秘書一樣,ARM核心就像老闆,老闆本來在做事,結果來了一個客戶,秘書打斷它,讓客戶進去了。而這個時候再來一個客戶,要麼秘書不斷去敲門問,要麼客戶走人。老闆第一個客戶沒有會見完,是不會理你的。
但是有一種情況例外,當ARM處在IRQ模式,這個時候fiq pin來了一個中斷信號,fiq
pin是什麼?是快速中斷呀,比如是公安局的來查刑事案件,那才不管你老闆是不是在會見客戶,直接打斷,進入到fiq模式下,並且跳到相應的fiq的異常向量表處去執行代碼。那如果當ARM處理FIQ模式,fiq
pin又來中斷信號,又就是又一批公安來了,那沒戲,都是執法人員,你打不斷我。那如果這個時候irq
pin來了呢?來了也不理呀,正在辦案,還敢來妨礙公務。
所以得出一個結論: IRQ模式只能被FIQ模式打斷,FIQ模式下誰也打不斷。
在打不斷的情況下,irq pin 或 fiq pin隨便你怎麼發中斷信號,都是白發。
所以除了fiq能打斷irq以外,根本沒有所謂中斷嵌套的情況。
Linux不用FIQ,只用到了IRQ。但是我們有時候一個中斷需要處理很長時間,那我們就需要佔用IRQ模式那麼長的時間嗎?沒有,linux在IRQ模式下只是簡單的記錄是什麼中斷,馬上就切換回了SVC模式,換句話說,Linux的中斷處理都是在SVC模式下處理的。
只不過SVC模式下的ISR上半部關閉了當前中斷線,下半部才重新打開

❹ Linux設備驅動中的並發

並發就是多個執行單元或多個進程並行執行,而這多個執行單元對資源進行共享,比如訪問同一個變數或同一個硬體資源,這個時候就很容易出現競態(說簡單點就是競爭同一個」女朋友」)。


為了處理並發帶來的問題,Linux有幾種處理方法:
1. 中斷屏蔽
2. 原子操作
3. 自旋鎖
4. 信號量
5. 互斥體
6. 完成量

以上幾種處理並發的方式各有利弊,需要根據實際情況來選擇使用哪一種。


它的原理就是讓CPU不響應中斷,一般使用這種方法的要求代碼段要比較少,不能佔用大量的時間。一般在驅動中不推薦使用這種方式。


原子量保證對一個整形數據的操作是排他性的。就是該操作絕不會在執行完畢前被任何其他任務或事件打斷。


自旋鎖是一種典型的對臨界資源進行互斥訪問的手段。當一個自旋鎖已經被其他線程持有,而另一個線程試圖去獲取自旋鎖,這時候就會一直在那裡等待(原地自旋等待)。如果遞歸調用自旋鎖,就會導致系統死鎖。


與自旋鎖不同的是,當獲取不到信號量時,進程不會原地打轉而是進入休眠等待狀態。新的Linux內核傾向於直接使用mutex作為互斥手段,信號量用作互斥不再被推薦使用。


當進程佔用資源時間較長時,用互斥體會比較好。


使用方法:

完成量的機制是實現一個線程發送一個信號通知另一個線程完成某個任務。一個線程調用wait_for_completion後就進入休眠,另一個線程執行完某個任務後就發送通知給進入休眠的線程,然後它就執行wait_for_completion後面的代碼。

❺ linux 內核中斷 用什麼鎖

首先我闡明一下,用鎖的情況只有兩種:
線程
文件
內核程序在使用的時候也脫離不了這兩種鎖的概念。
中斷,是信號,是否要處理中斷信號?或者產生中斷信號?
對信號來說只有:
信號屏蔽、信號捕捉、信號排隊、可重如函數等概念。
你想問的問題,我沒猜測,在處理某個信號時,不想讓其他信號中斷,那麼使用信號屏蔽字:
先設置要屏蔽的信號集,要保存的信號集,初始信號集,可供協調使用的函數有幾個:
#include <signal.h>
signal(這個不建議使用,應為有些老的實現是有問題的),設置信號處理程序
sig_atomic_t 數據類型
sigprocmask,設置信號屏蔽字
sigaction,設置信號處理程序,功能跟強悍,可控性更好
sigsuspend,以原子性方式,等待某些信號發生,然後返回
你具體要做啥不清楚,但使用上面的信號相關的函數,肯定能實現你的功能。參考APUE的論述。

❻ 中斷與操作系統之間有什麼關系

中斷由與系統相連的外設(比如網卡、硬碟)自動產生的。主要是用來通知操作系統系統外設狀態的變化。比如當網卡收到數據包的時候,就會發出一個中斷。我們通常所說的中斷指的是硬中斷(hardirq)。硬中斷是可以屏蔽的,軟中斷是不可以屏蔽的。

軟中斷則是手動由中斷指令產生。內核不會立即處理重新觸發的軟中斷。當大量軟中斷出現的時候,內核會喚醒一組內核線程來處理。這些線程的優先順序最低(nice值為19),這能避免它們跟其它重要的任務搶奪資源。但它們最終肯定會被執行,所以這個折中的方案能夠保證在軟中斷很多時用戶程序不會因為得不到處理時間而處於飢餓狀態,同時也保證過量的軟中斷最終會得到處理。

設計中斷系統時,硬中斷用於緊急的響應,而軟中斷一般用於處理硬中斷沒有完成的工作。

中斷有兩個重要的屬性,中斷號和中斷處理程序。中斷號用來標識不同的中斷,不同的中斷具有不同的中斷處理程序。在操作系統內核中維護著一個中斷向量表(Interrupt Vector Table),這個數組存儲了所有中斷處理程序的地址,而中斷號就是相應中斷在中斷向量表中的偏移量。

中斷與驅動
中斷產生時候 保護系統當前狀態,也就是把cpu當前的狀態保存起來

執行中斷程序,執行的中斷程序應該盡量短,不去過多佔用cpu時長,此處引入Linux的頂半部機制以及底半部機制,頂半部是指中斷代碼需要立即執行的情況,對於情況不緊急的情況,會將中斷程序注冊到隊列,在cpu運行狀態不是那麼繁忙的情況下再去執行程序,底半部機制是指中帶代碼需要立即執行,不得延誤(後面會詳細介紹頂半部機制以及底半部機制)。

恢復現場工作,中斷執行後,跳出中斷程序,並恢復中斷前cpu狀態,繼續執行之前的任務

❼ Linux中斷補充

在系統結構中,CPU工作的模式有兩種,一種是中斷,由各種設備發起;一種是輪詢,由CPU主動發起。
中斷IRQ:
中斷允許讓設備(如鍵盤,串口卡,並口等設備)表明它們需要CPU。一旦CPU接收了中斷請求,CPU就會暫時停止執行正在運行的程序,並且調用一個稱為中斷處理器或中斷服務程序(interrupt service routine)的特定程序。CPU處理完中斷後,就會恢復執行之前被中斷的程序。
中斷分類:
硬中斷+軟中斷
硬中斷:
①非屏蔽中斷:不能被屏蔽,硬體發生的錯誤:內存錯誤,風扇故障,溫度感測器故障等。
②可屏蔽中斷:可被CPU忽略或延遲處理。當緩存控制器的外部針腳被觸發的時候就會產生這種類型的中斷,而中斷屏蔽寄存器就會將這樣的中斷屏蔽掉。我們可以將一個比特位設置為0,來禁用在此針腳觸發的中斷。
軟中斷:
是軟體實現的中斷,也就是程序運行時其他程序對它的中斷;而硬中斷是硬體實現的中斷,是程序運行時設備對它的中斷。

CPU之間的中斷處理(IPI)
處理器間中斷允許一個CPU向系統其他的CPU發送中斷信號,處理器間中斷(IPI)不是通過IRQ線傳輸的,而是作為信號直接放在連接所有CPU本地APIC的匯流排上。
CALL_FUNCTION_VECTOR (向量0xfb)

發往所有的CPU,但不包括發送者,強制這些CPU運行發送者傳遞過來的函數,相應的中斷處理程序叫做call_function_interrupt(),例如,地址存放在群居變數call_data中來傳遞的函數,可能強制其他所有的CPU都停止,也可能強制它們設置內存類型範圍寄存器的內容。通常,這種中斷發往所有的CPU,但通過smp_call_function()執行調用函數的CPU除外。

RESCHEDULE_VECTOR (向量0xfc)

當一個CPU接收這種類型的中斷時,相應的處理程序限定自己來應答中斷,當從中斷返回時,所有的重新調度都自動運行。

INVALIDATE_TLB_VECTOR (向量0xfd)

發往所有的CPU,但不包括發送者,強制它們的轉換後援緩沖器TLB變為無效。相應的處理程序刷新處理器的某些TLB表項。

閱讀全文

與linux中斷屏蔽相關的資料

熱點內容
怎麼在app上進行機場升艙 瀏覽:133
fx3ga用什麼編程軟體 瀏覽:498
深度學習演算法樣本數量 瀏覽:966
電腦文件夾打開畫面塊狀 瀏覽:790
固態硬碟與機械盤的加密方法 瀏覽:634
unix編譯軟體 瀏覽:563
影視製作中西書局中央編譯出版社 瀏覽:822
變數作用域是編譯器決定的嗎 瀏覽:755
linux結構分析 瀏覽:812
程序員記錄歷史 瀏覽:798
編譯器怎麼調用構造函數的 瀏覽:97
高質量cpdf 瀏覽:824
福建電信代理伺服器雲主機 瀏覽:618
美圖看看pdf 瀏覽:434
編譯後報錯 瀏覽:294
網路設備怎麼加密 瀏覽:789
hbuilderx文件夾有哪些 瀏覽:102
空調壓縮機生產板塊 瀏覽:616
開源多媒體伺服器都有什麼 瀏覽:396
反編譯了別人的app會被發現嗎 瀏覽:918