㈠ linux系統中的中斷指令是什麼
什麼是中斷
Linux 內核需要對連接到計算機上的所有硬體設備進行管理,毫無疑問這是它的份內事。如果要管理這些設備,首先得和它們互相通信才行,一般有兩種方案可實現這種功能:
輪詢(polling) 讓內核定期對設備的狀態進行查詢,然後做出相應的處理;中斷(interrupt) 讓硬體在需要的時候向內核發出信號(變內核主動為硬體主動)。
第一種方案會讓內核做不少的無用功,因為輪詢總會周期性的重復執行,大量地耗用 CPU 時間,因此效率及其低下,所以一般都是採用第二種方案 。
對於中斷的理解我們先看一個生活中常見的例子:QQ。第一種情況:你正在工作,然後你的好友突然給你發送了一個窗口抖動,打斷你正在進行的工作。第
二種情況:當然你有時候也會每隔 5 分鍾就去檢查一下 QQ
看有沒有好友找你,雖然這很浪費你的時間。在這里,一次窗口抖動就可以被相當於硬體的中斷,而你就相當於 CPU,你的工作就是 CPU
這在執行的進程。而定時查詢就被相當於 CPU 的輪詢。在這里可以看到:同樣作為 CPU 和硬體溝通的方式,中斷是硬體主動的方式,較輪詢(CPU
主動)更有效些,因為我們都不可能一直無聊到每隔幾分鍾就去查一遍好友列表。
CPU
有大量的工作需要處理,更不會做這些大量無用功。當然這只是一般情況下。好了,這里又有了一個問題,每個硬體設備都中斷,那麼如何區分不同硬體呢?不同設
備同時中斷如何知道哪個中斷是來自硬碟、哪個來自網卡呢?這個很容易,不是每個 QQ 號碼都不相同嗎?同樣的,系統上的每個硬體設備都會被分配一個
IRQ 號,通過這個唯一的 IRQ 號就能區別張三和李四了。
從物理學的角度看,中斷是一種電信號,由硬體設備產生,並直接送入中斷控制器(如
8259A)的輸入引腳上,然後再由中斷控制器向處理器發送相應的信號。處理器一經檢測到該信號,便中斷自己當前正在處理的工作,轉而去處理中斷。此後,
處理器會通知 OS 已經產生中斷。這樣,OS
就可以對這個中斷進行適當的處理。不同的設備對應的中斷不同,而每個中斷都通過一個唯一的數字標識,這些值通常被稱為中斷請求線。
㈡ 關於linux中request_irq()
不對
是
㈢ 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上半部關閉了當前中斷線,下半部才重新打開
㈣ todesk是什麼軟體
演示機型:Iphone 13&&華為P50&&小米11系統版本:iOS 15&&HarmonyOS 2&&MIUI 12.5APP版本:ToDesk4.0.2
todesk是多平台遠程式控制制軟體。支持主流操作系統Windows、Linux、Mac、Android、iOS跨平台協同操作。ToDesk支持任何網路環境下的遠程實現,4.0版本開放100台設備列表。ToDesk設備連接主要通過兩台設備進行設備號關聯實現,主控設備填寫被控設備號即可實現遠程式控制制。
㈤ 為什麼linux下使用local_irq_disable無法關閉中斷
問題描述不明,所以無法正確的回答,最好你可以把前後關系說清楚。
㈥ LINUX軟中斷通信
我也是初學者,這里抄一段《Linux設備驅動程序》書上的給你:
Linux的中斷宏觀分為兩種:軟中斷和硬中斷。聲明一下,這里的軟和硬的意思是指和軟體相關以及和硬體相關,而不是軟體實現的中斷或硬體實現的中斷。軟中斷就是「信號機制」。軟中斷不是軟體中斷。Linux通過信號來產生對進程的各種中斷操作,我們現在知道的信號共有31個,其具體內容這里略過。
一般來說,軟中斷是由內核機制的觸發事件引起的(例如進程運行超時),但是不可忽視有大量的軟中斷也是由於和硬體有關的中斷引起的,例如當列印機埠產生一個硬體中斷時,會通知和硬體相關的硬中斷,硬中斷就會產生一個軟中斷並送到操作系統內核里,這樣內核就會根據這個軟中斷喚醒睡眠在列印機任務隊列中的處理進程。
硬中斷就是通常意義上的「中斷處理程序」,它是直接處理由硬體發過來的中斷信號的。當硬中斷收到它應當處理的中斷信號以後,就回去自己驅動的設備上去看看設備的狀態寄存器以了解發生了什麼事情,並進行相應的操作。
對於軟中斷,我們不做討論,那是進程調度里要考慮的事情。由於我們討論的是設備驅動程序的中斷問題,所以焦點集中在硬中斷里。我們這里討論的是硬中斷,即和硬體相關的中斷。
要中斷,是因為外設需要通知操作系統她那裡發生了一些事情,但是中斷的功能僅僅是一個設備報警燈,當燈亮的時候中斷處理程序只知道有事情發生了,但發生了什麼事情還要親自到設備那裡去看才行。也就是說,當中斷處理程序得知設備發生了一個中斷的時候,它並不知道設備發生了什麼事情,只有當它訪問了設備上的一些狀態寄存器以後,才能知道具體發生了什麼,要怎麼去處理。
設備通過中斷線向中斷控制器發送高電平告訴操作系統它產生了一個中斷,而操作系統會從中斷控制器的狀態位知道是哪條中斷線上產生了中斷。PC機上使用的中斷控制器是8259,這種控制器每一個可以管理8條中斷線,當兩個8259級聯的時候共可以控制15條中斷線。這里的中斷線是實實在在的電路,他們通過硬體介面連接到CPU外的設備控制器上。
並不是每個設備都可以向中斷線上發中斷信號的,只有對某一條確定的中斷線勇有了控制權,才可以向這條中斷線上發送信號。由於計算機的外部設備越來越多,所以15條中斷線已經不夠用了,中斷線是非常寶貴的資源。要使用中斷線,就得進行中斷線的申請,就是IRQ(Interrupt Requirement),我們也常把申請一條中斷線成為申請一個IRQ或者是申請一個中斷號。
IRQ是非常寶貴的,所以我們建議只有當設備需要中斷的時候才申請佔用一個IRQ,或者是在申請IRQ時採用共享中斷的方式,這樣可以讓更多的設備使用中斷。無論對IRQ的使用方式是獨占還是共享,申請IRQ的過程都是一樣的,分為3步:
1.將所有的中斷線探測一遍,看看哪些中斷還沒有被佔用。從這些還沒有被佔用的中斷中選一個作為該設備的IRQ。
2.通過中斷申請函數申請選定的IRQ,這是要指定申請的方式是獨占還是共享。
3.根據中斷申請函數的返回值決定怎麼做:如果成功了萬事大吉,如果沒成功則或者重新申請或者放棄申請並返回錯誤。
Linux中的中斷處理程序很有特色,它的一個中斷處理程序分為兩個部分:上半部(top half)和下半部(bottom half)。之所以會有上半部和下半部之分,完全是考慮到中斷處理的效率。
上半部的功能是「登記中斷」。當一個中斷發生時,他就把設備驅動程序中中斷常式的下半部掛到該設備的下半部執行隊列中去,然後就沒事情了--等待新的中斷的到來。這樣一來,上半部執行的速度就會很快,他就可以接受更多她負責的設備產生的中斷了。上半部之所以要快,是因為它是完全屏蔽中斷的,如果她不執行完,其它的中斷就不能被及時的處理,只能等到這個中斷處理程序執行完畢以後。所以,要盡可能多得對設備產生的中斷進行服務和處理,中斷處理程序就一定要快。
但是,有些中斷事件的處理是比較復雜的,所以中斷處理程序必須多花一點時間才能夠把事情做完。可怎麼樣化解在短時間內完成復雜處理的矛盾呢,這時候 Linux引入了下半部的概念。下半部和上半部最大的不同是下半部是可中斷的,而上半部是不可中斷的。下半部幾乎做了中斷處理程序所有的事情,因為上半部只是將下半部排到了他們所負責的設備的中斷處理隊列中去,然後就什麼都不管了。下半部一般所負責的工作是察看設備以獲得產生中斷的事件信息,並根據這些信息(一般通過讀設備上的寄存器得來)進行相應的處理。如果有些時間下半部不知道怎麼去做,他就使用著名的鴕鳥演算法來解決問題--說白了就是忽略這個事件。
由於下半部是可中斷的,所以在它運行期間,如果其它的設備產生了中斷,這個下半部可以暫時的中斷掉,等到那個設備的上半部運行完了,再回頭來運行它。但是有一點一定要注意,那就是如果一個設備中斷處理程序正在運行,無論她是運行上半部還是運行下半部,只要中斷處理程序還沒有處理完畢,在這期間設備產生的新的中斷都將被忽略掉。因為中斷處理程序是不可重入的,同一個中斷處理程序是不能並行的。
在Linux Kernel 2.0以前,中斷分為快中斷和慢中斷(偽中斷我們這里不談),其中快中斷的下半部也是不可中斷的,這樣可以保證它執行的快一點。但是由於現在硬體水平不斷上升,快中斷和慢中斷的運行速度已經沒有什麼差別了,所以為了提高中斷常式事務處理的效率,從Linux kernel 2.0以後,中斷處理程序全部都是慢中斷的形式了--他們的下半部是可以被中斷的。
但是,在下半部中,你也可以進行中斷屏蔽--如果某一段代碼不能被中斷的話。你可以使用cti、sti或者是save_flag、restore_flag來實現你的想法。
在處理中斷的時候,中斷控制器會屏蔽掉原先發送中斷的那個設備,直到她發送的上一個中斷被處理完了為止。因此如果發送中斷的那個設備載中斷處理期間又發送了一個中斷,那麼這個中斷就被永遠的丟失了。
之所以發生這種事情,是因為中斷控制器並不能緩沖中斷信息,所以當前一個中斷沒有處理完以前又有新的中斷到達,他肯定會丟掉新的中斷的。但是這種缺陷可以通過設置主處理器(CPU)上的「置中斷標志位」(sti)來解決,因為主處理器具有緩沖中斷的功能。如果使用了「置中斷標志位」,那麼在處理完中斷以後使用sti函數就可以使先前被屏蔽的中斷得到服務。
有時候需要屏蔽中斷,可是為什麼要將這個中斷屏蔽掉呢?這並不是因為技術上實現不了同一中斷常式的並行,而是出於管理上的考慮。之所以在中斷處理的過程中要屏蔽同一IRQ來的新中斷,是因為中斷處理程序是不可重入的,所以不能並行執行同一個中斷處理程序。在這里我們舉一個例子,從這里子例中可以看出如果一個中斷處理程序是可以並行的話,那麼很有可能會發生驅動程序鎖死的情況。當驅動程序鎖死的時候,你的操作系統並不一定會崩潰,但是鎖死的驅動程序所支持的那個設備是不能再使用了--設備驅動程序死了,設備也就死了。
A是一段代碼,B是操作設備寄存器R1的代碼,C是操作設備寄存器R2的代碼。其中激發PS1的事件會使A1產生一個中斷,然後B1去讀R1中已有的數據,然後代碼C1向R2中寫數據。而激發PS2的事件會使A2產生一個中斷,然後B2刪除R1中的數據,然後C2讀去R2中的數據。
如果PS1先產生,且當他執行到A1和B1之間的時候,如果PS2產生了,這是A2會產生一個中斷,將PS2中斷掉(掛到任務隊列的尾部),然後刪除了 R1的內容。當PS2運行到C2時,由於C1還沒有向R2中寫數據,所以C2將會在這里被掛起,PS2就睡眠在代碼C2上,直到有數據可讀的時候被信號喚醒。這是由於PS1中的B2原先要讀的R1中的數據被PS2中的B2刪除了,所以PS1頁會睡眠在B1上,直到有數據可讀的時候被信號喚醒。這樣一來,喚醒PS1和PS2的事件就永遠不會發生了,因此PS1和PS2之間就鎖死了。
由於設備驅動程序要和設備的寄存器打交道,所以很難寫出可以重入的代碼來,因為設備寄存器就是全局變數。因此,最簡潔的辦法就是禁止同一設備的中斷處理程序並行,即設備的中斷處理程序是不可重入的。
有一點一定要清楚:在2.0版本以後的Linux kernel中,所有的上半部都是不可中斷的(上半部的操作是原子性的);不同設備的下半部可以互相中斷,但一個特定的下半部不能被它自己所中斷(即同一個下半部不能並)。
由於中斷處理程序要求不可重入,所以程序員也不必為編寫可重入的代碼而頭痛了。編寫可重入的設備驅動程序是可以的,編寫可重入的中斷處理程序是非常難得,幾乎不可能。
我們都知道,一旦競爭條件出現了,就有可能會發生死鎖的情況,嚴重時可能會將整個系統鎖死。所以一定要避免競爭條件的出現。只要注意一點:絕大多數由於中斷產生的競爭條件,都是在帶有中斷的
內核進程被睡眠造成的。所以在實現中斷的時候,一定要相信謹慎的讓進程睡眠,必要的時候可以使用cli、sti或者save_flag、restore_flag。
㈦ linux中斷的問題
不會阻塞中斷處理函數,因為disable_irq_nosync只是屏蔽中斷觸發,而不是屏蔽中斷處理函數,
一般中斷分為上半部和下半部,中斷處理函數是在下半部,中斷屏蔽只是在上半部;你應該先了解中斷原理在來看代碼,你應該先看一下《深入理解linux內核》這本書的中斷部分
㈧ 如何指定CPU只運行特定任務,linux中斷interrupt
cpuset 允許把所有進程echo到一個cpuset目錄中,與指定的cpu綁定。
The following script which is a starting point for investigating willmove all the processes to a specific cpuset with one cpu.
if[!-d/sys/fs/cgroup];then
echo"cgroupnotsupportedbythekernel"
else
mkdir/sys/fs/cgroup/cpuset
mount-tcgroup-ocpusetcpuset/sys/fs/cgroup/cpuset
echo1>/sys/fs/cgroup/cpuset/cgroup.clone_children
mkdir/sys/fs/cgroup/cpuset/cpu0
mkdir/sys/fs/cgroup/cpuset/cpu1
#assignacpuforcgroupcpu0
echo0>/sys/fs/cgroup/cpuset/cpu0/cpuset.cpus
#moveoutselftothisnewcgroup
echo$$>/sys/fs/cgroup/cpuset/cpu0/tasks
foriin$(cat/sys/fs/cgroup/cpuset/tasks);do
echo$i>/sys/fs/cgroup/cpuset/cpu0/tasks||echo"failedtoaddpid$i/$(cat/proc/$i/comm)"
done
#assignacpuforcgroupcpu1
echo1>/sys/fs/cgroup/cpuset/cpu1/cpuset.cpus
#
#totheothercgroupwon'tuseit
echo1>/sys/fs/cgroup/cpuset/cpu1/cpuset.cpu_exclusive
fi
把系統中的進程與CPU0綁定,然後把CPU1設置 exclusive屬性,這樣其它cgroup不會使用這個CPU。
開啟stress壓力測試
在此基礎上再開啟一個CPUhot:
可見新啟動的任務不會佔用CPU1。
將CPUhot進程與 CPU1綁定:
此時觀察CPU使用率:
另外還有一個問題就是怎樣禁止一個中斷打斷cpu?
內核提供了中斷的affinity,但要使用這個還需要關閉 irq balancer 進程。
如下腳本可以設置中斷的cpu affinity。
for i in $(find /proc/irq -name "smp_affinity"); do echo 1 > $i; done
以上腳本把所有中斷的CPU Affinity都設置為CPU0。
這樣在/proc/irq目錄下的每一個中斷其CPU Affinity都被設置為CPU0。
此時仍有一系列的中斷會打斷CPU1:
Single function call interrupts
Local timer interrupts
另外要讓中斷的CPU Affinity起作用,irq balance 服務必須被關閉。但這樣中斷負載平衡就被打斷,能不能修改irq balance 代碼,讓其在規定的若干個CPU核心上負責中斷平衡
㈨ Linux下通過哪個命令怎麼查看中斷
與Linux設備驅動中中斷處理相關的首先是申請與釋放IRQ的API request_irq()和free_irq()。
C++是一種面向對象的計算機程序設計語言,由美國AT&T貝爾實驗室的本賈尼·斯特勞斯特盧普博士在20世紀80年代初期發明並實現,最初它被稱作「C with Classes」(包含類的C語言)。
它是一種靜態數據類型檢查的、支持多重編程範式的通用程序設計語言,支持過程化程序設計、數據抽象、面向對象程序設計、泛型程序設計等多種程序設計風格。
在C基礎上,一九八三年又由貝爾實驗室的Bjarne Strou-strup推出了C++,C++進一步擴充和完善了C語言,成為一種面向 對象的程序設計語言。
C++目前流行的編譯器最新版本是Borland C++ 4.5,Symantec C++ 6.1,和Microsoft Visual C++ 2012。
㈩ 請教linux irq 中斷能使用mutex互斥鎖嗎
從Backtrace來看,應該是i2c_transfer中調用mutex_lock導致schele調用
而產生進程調度,導致死機.而在中斷上下文,這種情況是絕對不允許發生的.換句話說是不允許
睡眠的,不允許進程調度.
你可以把mutex_lock注釋掉再試試.