A. linux中斷 異常 系統調用 中斷上半部 中斷下半部 這些有什麼區別和聯系
中斷分軟中斷跟硬中斷,硬中斷是由硬體從外部觸發,軟中斷由軟體觸發,就像linux系統調用int 80一樣。至於中斷的上下部其實就是因為中斷的處理時間跟它的優先順序不一定成正比,所以一般先處理中斷最重要的部分(上半部),待到不怎麼忙的時候,再來處理比較悠閑的部分(下半部)。就像輸入的時候,拿到鍵盤輸入的是什麼才是最重要的(上半部),顯示字元才是次要的(下半部)。
B. Linux-怎麼理解軟中斷
中斷是系統用來響應硬體設備請求的一種機制,它會打斷進程的正常調度和執行,然後調用內核中的中斷處理程序來響應設備的請求。
你可能要問了,為什麼要有中斷呢?我可以舉個生活中的例子,讓感受一下中斷的魅力。
比如你訂了一份外賣,但是不確定外賣什麼時候送到,也沒有別的方法了解外賣的進度,但是,配送員送外賣是不等人的,到了你這兒沒人取的話,就直接走人了,所以你只能苦苦等著,時不時去門口看看外賣送到沒,而不能幹其他事情。
不過呢,如果在訂外賣的時候,你就跟配送員約定好,讓他送到後給你打個電話,那你就不用苦苦等待了,就可以去忙別的事情,直到電話一響,接電話、取外賣就可以了。
這里的「打電話」,其實就是一個中斷。沒接到電話的時候,你可以做其他的事情;只有接到了電話(也就是發生中斷),你才要進行另一個動作:取外賣。
這個例子你就可以發現, 中斷其實是一種非同步的事件處理機制,可以提高系統的並發處理能力。
由於中斷處理程序會打斷其他進程的運行,所以, 為了減少對正常進程運行調度的影響,中斷處理程序就需要盡可能快地運行。 如果中斷本身要做的事情不多,那麼處理起來也不會有太大問題;但如果中斷要處理的事情很多,中斷服務程序就有可能要運行很長時間。
特別是,中斷處理程序在響應中斷時,還會臨時關閉中斷。這就會導致上一次中斷處理完成之前,其他中斷都不能響應,也就是說中斷有可能會丟失。
那麼還是以取外賣為例。假如你訂了 2 份外賣,一份主食和一份飲料,並且是由 2 個不同的配送員來配送。這次你不用時時等待著,兩份外賣都約定了電話取外賣的方式。但是,問題又來了。
當第一份外賣送到時,配送員給你打了個長長的電話,商量發票的處理方式。與此同時,第二個配送員也到了,也想給你打電話。
但是很明顯,因為電話占線(也就是關閉了中斷響應),第二個配送員的電話是打不通的。所以,第二個配送員很可能試幾次後就走掉了(也就是丟失了一次中斷)。
如果你弄清楚了「取外賣」的模式,那對系統的中斷機制就很容易理解了。事實上,為了解決中斷處理程序執行過長和中斷丟失的問題,Linux 將中斷處理過程分成了兩個階段,也就是 上半部和下半部:
比如說前面取外賣的例子,上半部就是你接聽電話,告訴配送員你已經知道了,其他事兒見面再說,然後電話就可以掛斷了;下半部才是取外賣的動作,以及見面後商量發票處理的動作。
這樣,第一個配送員不會佔用你太多時間,當第二個配送員過來時,照樣能正常打通你的電話。
除了取外賣,我再舉個最常見的網卡接收數據包的例子,讓你更好地理解。
網卡接收到數據包後,會通過 硬體中斷 的方式,通知內核有新的數據到了。這時,內核就應該調用中斷處理程序來響應它。你可以自己先想一下,這種情況下的上半部和下半部分別負責什麼工作呢?
對上半部來說,既然是快速處理,其實就是要把網卡的數據讀到內存中,然後更新一下硬體寄存器的狀態(表示數據已經讀好了),最後再發送一個 軟中斷 信號,通知下半部做進一步的處理。
而下半部被軟中斷信號喚醒後,需要從內存中找到網路數據,再按照網路協議棧,對數據進行逐層解析和處理,直到把它送給應用程序。
所以,這兩個階段你也可以這樣理解:
實際上,上半部會打斷 CPU 正在執行的任務,然後立即執行中斷處理程序。而下半部以內核線程的方式執行,並且每個 CPU 都對應一個軟中斷內核線程,名字為 「ksoftirqd/CPU 編號」,比如說, 0 號 CPU 對應的軟中斷內核線程的名字就是 ksoftirqd/0。
不過要注意的是,軟中斷不只包括了剛剛所講的硬體設備中斷處理程序的下半部,一些內核自定義的事件也屬於軟中斷,比如內核調度和 RCU 鎖(Read-Copy Update 的縮寫,RCU 是 Linux 內核中最常用的鎖之一)等。
不知道你還記不記得,前面提到過的 proc 文件系統。它是一種內核空間和用戶空間進行通信的機制,可以用來查看內核的數據結構,或者用來動態修改內核的配置。其中:
運行下面的命令,查看 /proc/softirqs 文件的內容,你就可以看到各種類型軟中斷在不同 CPU 上的累積運行次數:
在查看 /proc/softirqs 文件內容時,你要特別注意以下這兩點。
第一,要注意軟中斷的類型,也就是這個界面中第一列的內容。從第一列你可以看到,軟中斷包括了 10 個類別,分別對應不同的工作類型。比如 NET_RX 表示網路接收中斷,而 NET_TX 表示網路發送中斷。
第二,要注意同一種軟中斷在不同 CPU 上的分布情況,也就是同一行的內容。正常情況下,同一種中斷在不同 CPU 上的累積次數應該差不多。比如這個界面中,NET_RX 在 CPU0 和 CPU1 上的中斷次數基本是同一個數量級,相差不大。
不過你可能發現,TASKLET 在不同 CPU 上的分布並不均勻。TASKLET 是最常用的軟中斷實現機制,每個 TASKLET 只運行一次就會結束 ,並且只在調用它的函數所在的 CPU 上運行。
因此,使用 TASKLET 特別簡便,當然也會存在一些問題,比如說由於只在一個 CPU 上運行導致的調度不均衡,再比如因為不能在多個 CPU 上並行運行帶來了性能限制。
另外,剛剛提到過,軟中斷實際上是以內核線程的方式運行的,每個 CPU 都對應一個軟中斷內核線程,這個軟中斷內核線程就叫做 ksoftirqd/CPU 編號。那要怎麼查看這些線程的運行狀況呢?
其實用 ps 命令就可以做到,比如執行下面的指令:
注意,這些線程的名字外面都有中括弧,這說明 ps 無法獲取它們的命令行參數(cmline)。一般來說,ps 的輸出中,名字括在中括弧里的,一般都是內核線程。
Linux 中的中斷處理程序分為上半部和下半部:
上半部對應硬體中斷,用來快速處理中斷。
下半部對應軟中斷,用來非同步處理上半部未完成的工作。
Linux 中的軟中斷包括網路收發、定時、調度、RCU 鎖等各種類型,可以通過查看 /proc/softirqs 來觀察軟中斷的運行情況。
C. Linux硬體中斷服務程序中為什麼不能睡眠
以下是根據一些資料和個人理解總結的,如有錯誤希望指出。
首先需要明確的是,這里的中斷指的是硬體中斷。
從事實上說明 有下面這些理由。
硬體中斷本身就是用來作為處理緊急事件的一種方法,所以硬體中斷服務程序應該盡量的快。不應該睡眠
硬體中斷服務程序會打斷某個無辜的進程(甚至是另一個中斷服務程序)。所以它應該盡量快(突然被打斷運行已經夠無辜了,總不能還讓一直等待吧)
硬體中斷是無法預測的,如果在中斷服務程序中睡眠就會導致睡眠過程中該中斷請求的丟失。(linux中一個中斷處理程序在運行時,相應中斷線會被屏蔽掉)
要理解為什麼硬體中斷處理程序中不能睡眠的內在機制。需要理解下面這些概念。
1 linux內核的工作模式 linux內核有兩種工作模式,進程上下文和中斷上下文。
1.1 進程上下文指內核代表進程執行
比如進程執行系統調用產生異常陷入內核後,內核就代表該進程執行操作。可以通過current宏關聯到當前進程,
因為陷入內核時進程造成的或需求的,所以內核的執行與當前進程相關。所以說他代表該進程執行
1.2 執行一個硬體中斷處理程序時就處於中斷上下文
中斷上下中和進程沒什麼關系(雖然此時current指向被中斷的進程)。這也容易理解,因為硬體中斷隨時
都有可能發生。不像上面提到的像系統調用之類的異常是由於程序執行某些指令造成的,所以陷入
內核後,因為要坐的工作基本都是和當前這個進程相關的(因為是他執行一些指令導致產生的異常),
所以我們說內核代表進程執行。
但是硬體中斷的產生完全無法預測,所以誰也不知道硬體中斷將會打斷哪個進程。所以硬體中斷服務程序與進程無關
它處於中斷上下文中
2 異常和硬體中斷的區別
2.1 異常屬於中斷的一種,和硬體中斷的區別在與它是"同步",是由於執行一些指令造成的。如除0
或者執行過程中產生缺頁,以及軟中斷實現的系統調用。(這也是叫「同步中斷」的原因,因為指令的執行是要時鍾同步的)。
當執行的指令會陷入內核時,就會運行在進程上下文中。內核代表進程
2.2 硬體中斷時一種 非同步中斷,他隨時都可能發生,無法預測。中斷執行時處於中斷上下文中。
綜上,linux中硬體中斷服務程序不能睡眠的原因在與。執行硬體中斷服務程序時,內核處於中斷上下文
中,此時內核與進程無關。如果睡眠後就不能調度回來了。因為調度程序調度的是進程,而之前的硬體中斷服務程序卻是和進程無關的
D. linux驅動中斷號不對
linux驅動中斷號不對原因分析:
Linux的中斷宏觀分為兩種:軟中斷差棗和硬中斷。聲明一下,這里的軟和硬的意思是指和軟體相關以及和硬體相關,虛滑拆而不是軟體實現的讓埋中斷或硬體實現的中斷。
E. 海康linux 斷電後 服務中斷了
服務中斷有兩方面(硬體、軟體);軟體,其他能顯示,那說明這幾個可能設置出問題(方法:檢查設置);硬體方喚老租面,主要原因有線路中斷、硬體老化等,需要設備實地檢查。
致力於物聯網產品研發製造以及整套解決方案的提供,產品廣泛應用於智慧交通、智慧工地、物資管理、金融管理、圖書檔案、生產製造、倉儲物流、防偽溯和兆源、跟蹤定位等領域含做。
F. 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。