❶ linux涓鏂紼嬪簭鎸囦護linux涓鏂紼嬪簭
linux濡備綍寮哄埗涓鏂錛
llinux寮哄埗涓鏂鐨勫懡浠ゆ湁浠ヤ笅涓や釜錛
linux鍋滄㈠懡浠ゆ柟娉曚竴
緇堟㈠綋鍓嶆e湪鎵ц岀殑鏌愪釜鍛戒護鏈蹇鐨勬柟娉曟槸鎸変笅緇勫悎閿鈥淐trl+C鈥濄傝繖涓鏂規硶鍙鏈夊湪鐢ㄦ埛鑳藉熶粠鏌愪釜鉶氭嫙鎺у埗鍙頒笂鎺у埗榪欎釜紼嬪簭鐨勬椂鍊欐墠濂忔晥銆
linux鍋滄㈠懡浠ゆ柟娉曚簩
緇堟㈡煇涓鍑洪敊紼嬪簭鐨勫彟澶栦竴涓鍔炴硶鏄痥ill(鏉)鎺夊畠鐨勮繘紼嬨傝鋒寜鐓т笅闈㈢殑鏂規硶榪涜屾搷浣滐細
1)杈撳叆鈥減s鈥濆懡浠よ幏鍙栬繘紼嬬殑PID錛岃繖涓鍛戒護瑕佹眰浣犳槸榪愯岃繖涓紼嬪簭鐨勯偅涓浜烘垨鑰呮槸鏍圭敤鎴楓傚傛灉鏄鏍圭敤鎴鳳紝璇瘋緭鍏モ減s-aux鈥濆懡浠ゆ煡鐪嬫墍鏈夌殑榪涚▼錛屼笉綆℃槸璋佹嫢鏈夊畠浠鐨勩
2)鍦ㄦ竻鍗曚腑鎵懼埌榪欎釜鍑洪敊榪涚▼銆傚洜涓虹▼搴忕殑鍚嶇О鍒楀湪娓呭崟鐨勬渶鍙寵竟錛岄氬父涓鐪煎氨鍙浠ユ壘鍒板畠銆
3)璇瘋頒笅ps鍛戒護杈撳嚭娓呭崟涓榪涚▼鐘舵佽屾渶宸﹁竟鐨処D鏁板瓧銆
4)杈撳叆鈥渒illID鈥濓紝緇堟㈣ヨ繘紼嬨
linux鍝涓椹卞姩澶勭悊緋葷粺涓鏂錛
涓嶭inux璁懼囬┍鍔ㄤ腑涓鏂澶勭悊鐩稿叧鐨勯栧厛鏄鐢寵蜂笌閲婃斁IRQ鐨凙PIrequest_irq()鍜宖ree_irq()錛宺equest_irq()鐨勫師鍨嬩負錛歩ntrequest_irq(unsignedintirq,void(*handler)(intirq,void*dev_id,structpt_regs*regs),unsignedlongirqflags,constchar*devname,void*dev_id);irq鏄瑕佺敵璇風殑紜浠朵腑鏂鍙鳳紱handler鏄鍚戠郴緇熺櫥璁扮殑涓鏂澶勭悊鍑芥暟錛屾槸涓涓鍥炶皟鍑芥暟錛屼腑鏂鍙戠敓鏃訛紝緋葷粺璋冪敤榪欎釜鍑芥暟錛宒ev_id鍙傛暟灝嗚浼犻掞紱irqflags鏄涓鏂澶勭悊鐨勫睘鎬э紝鑻ヨ劇疆SA_INTERRUPT錛屾爣鏄庝腑鏂澶勭悊紼嬪簭鏄蹇閫熷勭悊紼嬪簭錛屽揩閫熷勭悊紼嬪簭琚璋冪敤鏃跺睆钄芥墍鏈変腑鏂錛屾參閫熷勭悊紼嬪簭涓嶅睆钄斤紱鑻ヨ劇疆SA_SHIRQ錛屽垯澶氫釜璁懼囧叡浜涓鏂錛宒ev_id鍦ㄤ腑鏂鍏變韓鏃朵細鐢ㄥ埌錛屼竴鑸璁劇疆涓鴻繖涓璁懼囩殑device緇撴瀯鏈韜鎴栬匩ULL銆
linux涓鏂鏈哄埗涓昏佹濇兂錛
Linux灝嗕腑鏂澶勭悊榪囩▼鍒嗘垚浜嗕袱涓闃舵碉紝涔熷氨鏄涓婂崐閮ㄥ拰涓嬪崐閮ㄣ備笂鍗婇儴鐢ㄦ潵蹇閫熷勭悊涓鏂錛屽畠鍦ㄤ腑鏂紱佹㈡ā寮忎笅榪愯岋紝涓昏佸勭悊璺熺‖浠剁揣瀵嗙浉鍏崇殑鎴栨椂闂存晱鎰熺殑宸ヤ綔銆備篃灝辨槸鎴戜滑甯歌寸殑紜涓鏂錛岀壒鐐規槸蹇閫熸墽琛屻備笅鍗婇儴鐢ㄦ潵寤惰繜澶勭悊涓婂崐閮ㄦ湭瀹屾垚鐨勫伐浣滐紝閫氬父浠ュ唴鏍哥嚎紼嬬殑鏂瑰紡榪愯屻備篃灝辨槸鎴戜滑甯歌寸殑杞涓鏂錛岀壒鐐規槸寤惰繜鎵ц屻
Linux涓鏈夌‖浠朵腑鏂鍜岃蔣浠朵腑鏂銆備絾鏄瀵逛簬紜浠朵腑鏂鐨勫勭悊鏈変袱涓鍘熷垯錛氫笉鑳藉祵濂楋紝瓚婂揩瓚婂ソ銆傦紙鏃╄搗Linux鐗堟湰鏄鏀鎸佷腑鏂宓屽楋級
褰揂RM澶勭悊鍣ㄦ敹鍒頒腑鏂鐨勬椂鍊欙紝瀹冭繘鍏ヤ腑鏂妯″紡錛屽悓鏃禔RM澶勭悊鍣ㄧ殑CPSR瀵勫瓨鍣ㄧ殑IRQ浣嶄細琚紜浠惰劇疆涓哄睆钄絀RQ銆
linux涓鏂鍛戒護錛
Tab銆
榪欐槸浣犱笉鑳芥病鏈夌殑Linux蹇鎹鋒柟寮忋傚畠灝嗕負鎮ㄨ妭鐪丩inux鍛戒護琛屼腑鐨勫ぇ閲忔椂闂淬
鍙闇杈撳叆鍛戒護銆佹枃浠跺悕銆佺洰褰曞悕鐢氳嚦鍛戒護閫夐」錛岀劧鍚庡崟鍑籘ab閿錛屽畠浼氳嚜鍔ㄥ畬鎴愭偍杈撳叆鐨勫唴瀹癸紝鎴栬呬細鏄劇ず鎵鏈夊彲鑳界殑緇撴灉銆
Ctrl+C銆
榪欎釜緇勫悎鑳藉湪緇堢涓婁腑鏂鍛戒護鎴栬繘紼嬨傛寜涓嬪畠灝嗙珛鍗沖仠姝㈡e湪榪愯岀殑紼嬪簭銆
鍦╨inux涓濡備綍緇堟㈡寚浠ょ殑榪愯岋紵
1銆侀栧厛鎵撳紑linux緇堢錛岃繍琛屼竴孌礟ython紼嬪簭錛
2銆佺劧鍚庡湪紼嬪簭榪愯屼腑錛岄渶瑕佺粓姝㈢▼搴忚繍琛屾椂錛屾寜涓嬪揩鎹烽敭crtl錛媍灝卞彲浠ョ粓姝㈡寚浠ょ▼搴忥紝姝ゆ椂榪愯岀殑榪欐祊ython紼嬪簭灝辮緇堟浜嗐傛墍鏈夌殑鎸囦護閮藉彲浠ョ敤榪欎釜蹇鎹烽敭緇堟㈣繍琛岋細
3銆佹渶鍚庡啀嬈¤繍琛屼竴涓嬪垰鎵嶇殑紼嬪簭錛岃繖閲岀洿鎺ヤ嬌鐢–trl+Z蹇鎹烽敭緇堟㈣繍琛岀▼搴忔槸鍙浠ヨ揪鍒板悓鏍風殑鏁堟灉鐨勶細
❷ 《Linux設備驅動程序》(十六)-中斷處理
設備與處理器之間的工作通常來說是非同步,設備數據要傳遞給處理器通常來說有以下幾種方法:輪詢、等待和中斷。
讓CPU進行輪詢等待總是不能讓人滿意,所以通常都採用中斷的形式,讓設備來通知CPU讀取數據。
2.6內核的函數參數與現在的參數有所區別,這里都主要介紹概念,具體實現方法需要結合具體的內核版本。
request_irq函數申請中斷,返回0表示申請成功,其他返回值表示申請失敗,其具體參數解釋如下:
flags 掩碼可以使用以下幾個:
快速和慢速處理常式 :現代內核中基本沒有這兩個概念了,使用SA_INTERRUPT位後,當中斷被執行時,當前處理器的其他中斷都將被禁止。通常不要使用SA_INTERRUPT標志位,除非自己明確知道會發生什麼。
共享中斷 :使用共享中斷時,一方面要使用SA_SHIRQ位,另一個是request_irq中的dev_id必須是唯一的,不能為NULL。這個限制的原因是:內核為每個中斷維護了一個共享處理常式的列表,常式中的dev_id各不相同,就像設備簽名。如果dev_id相同,在卸載的時候引起混淆(卸載了另一個中斷),當中斷到達時會產生內核OOP消息。
共享中斷需要滿足以下一個條件才能申請成功:
當不需要使用該中斷時,需要使用free_irq釋放中斷。
通常我們會在模塊載入的時候申請安裝中斷處理常式,但書中建議:在設備第一次打開的時候安裝,在設備最後一次關閉的時候卸載。
如果要查看中斷觸發的次數,可以查看 /proc/interrupts 和 /proc/stat。
書中講述了如何自動檢測中斷號,在嵌入式開發中通常都是查看原理圖和datasheet來直接確定。
自動檢測的原理如下:驅動程序通知設備產生中斷,然後查看哪些中斷信號線被觸發了。Linux提供了以下方法來進行探測:
探測工作耗時較長,建議在模塊載入的時候做。
中斷處理函數和普通函數其實差不多,唯一的區別是其運行的中斷上下文中,在這個上下文中有以下注意事項:
中斷處理函數典型用法如下:
中斷處理函數的參數和返回值含義如下:
返回值主要有兩個:IRQ_NONE和IRQ_HANDLED。
對於中斷我們是可以進行開啟和關閉的,Linux中提供了以下函數操作單個中斷的開關:
該方法可以在所有處理器上禁止或啟用中斷。
需要注意的是:
如果要關閉當前處理器上所有的中斷,則可以調用以下方法:
local_irq_save 會將中斷狀態保持到flags中,然後禁用處理器上的中斷;如果明確知道中斷沒有在其他地方被禁用,則可以使用local_irq_disable,否則請使用local_irq_save。
locat_irq_restore 會根據上面獲取到flags來恢復中斷;local_irq_enable 會無條件打開所有中斷。
在中斷中需要做一些工作,如果工作內容太多,必然導致中斷處理所需的時間過長;而中斷處理又要求能夠盡快完成,這樣才不會影響正常的系統調度,這兩個之間就產生了矛盾。
現在很多操作系統將中斷分為兩個部分來處理上面的矛盾:頂半部和底半部。
頂半部就是我們用request_irq來注冊的中斷處理函數,這個函數要求能夠盡快結束,同時在其中調度底半部,讓底半部在之後來進行後續的耗時工作。
頂半部就不再說明了,就是上面的中斷處理函數,只是要求能夠盡快處理完成並返回,不要處理耗時工作。
底半部通常使用tasklet或者工作隊列來實現。
tasklet的特點和注意事項:
工作隊列的特點和注意事項:
❸ Linux進入臨界去開關中斷的幾種方式
進入中斷時候關閉全局的中斷是為了避免程序處理中斷過程中,再進入另一個中斷打亂執行的順序,也就是為了防止中斷嵌套的情況發生。比如在irq_handler函數中首先就應該關閉中斷。或者,在某些操作順序中是不允許中斷發生打斷的情況。例如在驅動中常用的方式:
unsigned int flag;
local_irq_save(&flag);
... ... ... ...
local_irq_restore(&flag);
spin_loc_irqsave 禁止中斷(只在本地處理器)在獲得自旋鎖之前; 之前的中斷狀態保存在 flags 里. 如果你絕對確定在你的處理器上沒有禁止中斷的(或者, 換句話說, 你確信你應當在你釋放你的自旋鎖時打開中斷),你可以使用 spin_lock_irq 代替, 並且不必保持跟蹤 flags. 最後, spin_lock_bh 在獲取鎖之前禁止軟體中斷, 但是硬體中斷留作打開的。
❹ linux內核在執行中斷處理時是關中斷的嗎
1、中斷處理程序與其他內核函數真正的區別在於,中斷處理程序是被內核調用來相應中斷的,而它們運行於中斷上下文(原子上下文)中,在該上下文中執行的代碼不可阻塞。中斷就是由硬體打斷操作系統。
2、異常與中斷不同,它在產生時必須考慮與處理器時鍾同步。異常被稱為同步中斷,例如:除0、缺頁異常、陷入內核(trap)引起系統調用處理程序異常。
3、不同的設備對應的中斷不同,而每個中斷都通過一個唯一的數字(中斷號)標識。
4、既想讓中斷處理程序運行得快,又想中斷處理程序完成的工作量多,為了在這兩個相悖的目標之間達到一種平衡,一般把中斷處理分為兩個部分。中斷處理程序是上半部(top half):接收到一個中斷,它就立刻開始執行,但只做有嚴格時限的工作,例如對接受的中斷進行應答或者復位硬體,這些工作都是在中斷被禁止的情況下完成的(上半部情況下,中斷被禁止);另一部分是下半部(bottom half):能夠被允許稍後完成的工作會推遲到下半部。
❺ 如何關閉linux smp中斷
在多 CPU 的環境中,還有一個中斷平衡的問題,比如,網卡中斷會教給哪個 CPU 處理,這個參數控制哪些 CPU 可以綁定 IRQ 中斷。其中的 {number} 是對應設備的中斷編號,可以用下面的命令找出:
cat /proc/interrupt
比如,一般 eth0 的 IRQ 編號是 16,所以控制 eth0 中斷綁定的 /proc 文件名是 /proc/irq/16/smp_affinity。上面這個命令還可以看到某些中斷對應的CPU處理的次數,預設的時候肯定是不平衡的。
設置其值的方法很簡單,smp_affinity 自身是一個位掩碼(bitmask),特定的位對應特定的 CPU,這樣,01 就意味著只有第一個 CPU 可以處理對應的中斷,而 0f(0x1111)意味著四個 CPU 都會參與中斷處理。
幾乎所有外設都有這個參數設置,可以關注一下。
這個數值的推薦設置,其實在很大程度上,讓專門的CPU處理專門的中斷是效率最高的,比如,給磁碟IO一個CPU,給網卡一個CPU,這樣是比較合理的。
現在的伺服器一般都是多核了,但是中斷很多時候都是只用一個核,如果有些中斷要求比較高,可以把它獨立分配給一個cpu使用。
❻ linux下 軟中斷處理函數do_softirq中用了local_irq_disable()來屏蔽中斷
中斷屏蔽,確實會導致中斷丟失。但是,中斷控制器本身會保證中斷不被丟失。對於水平觸發中斷,一個中斷發送出去,如果沒有cpu的ack,會一直懸停在那,直到相應為止。一個邊緣觸發的中斷,是設計成可以丟失的中斷,丟失了也無所謂。因為中斷控制器會重發。
對於網路數據中的大量中斷,有NAPI的方式來實現。