導航:首頁 > 編程系統 > linux中斷會重入么

linux中斷會重入么

發布時間:2023-05-16 12:59:33

linux支持中斷嵌套嗎

中斷嵌套, 對於不同的衡掘中斷是可以自由嵌套的,而對於同種類型的中斷,是不可以嵌套執行的。
以下簡單解釋一下如何利用狀態標志來防止同種類型中斷的重入:
當某種類型的中咐哪核斷第一次發生時,首先其idt表項的狀態位上被賦予IRQ_PENDING標志,表示有待處理。 然後將中斷處理函數action置為null,然後由於其狀態沒有IRQ_INPROGRESS標志(第一次),故將其狀態置上IRQ_INPROGRESS並去處IRQ_PENDING標緩凳志,同時將action賦予相應的中斷處理函數指針(這里是一個重點,linux很巧妙的用法,隨後說明)。這樣,後面就可以順利執行handle_IRQ_event進行中斷處理,當在handle_IRQ_event中開中斷後(我認為應該是回復EOI給PCI),如果有同種類型的中斷發生,則再次進入do_IRQ函數,然後其狀態位上加上IRQ_PENDING標志,但是由於前一次中斷處理中加上的IRQ_INPROGRESS沒有被清除,因此這里無法清除IRQ_PENDING標志,因此action還是為null,這樣就無法再次執行handle_IRQ_event函數。從而退出本次中斷處理,返回上一次的中斷處理函數中,即繼續執行handle_IRQ_event函數。當handle_IRQ_event返回時檢查IRQ_PENDING標志,發現存在這個標志,說明handle_IRQ_event執行過程中被中斷過,存在未處理的同類中斷,因此再次循環執行handle_IRQ_event函數。直到不存在IRQ_PENDING標志為止。

Ⅱ 如何利用狀態標志來防止同種類型中斷的重入

關於中斷嵌套:在linux內核里,如果驅動在申請注冊中斷的時候沒有特別的指定,do_irq在做中斷響應的時候,是開啟中斷的,如果在驅動的中斷處理函數正在執行的過程中,出現同一設備的中斷或者不同設備的中斷,這時候新的中斷會被立即處理,還是被pending,等當前中斷處理完成後,再做處理。在2.4和2.6內核里,關於這一塊是否有什麼不同。 一般申請中斷的時候都允許開中斷,即不使用SA_INTERRUPT標志。如果允許共享則加上 SA_SHIRQ,如果可以為內核熵池提供熵值(譬如你寫的驅動是ide之類的驅動),則再加上 SA_SAMPLE_RANDOM標志。這是普通的中斷請求過程。對於這種一般情況,只要發生中斷,就可以搶占內核,即使內核正在執行其他中斷函數。這里有兩點說明:一是因為linux不支持 中斷優先順序,因此任何中斷都可以搶占其他中斷,但是同種類型的中斷(即定義使用同一個 中斷線的中斷)不會發生搶占,他們會在執行本類型中斷的時候依次被調用執行。二是所謂 只要發生中斷,就可以搶占內核這句是有一定限制的,因為當中斷發生的時候系統由中斷門 進入時自動關中斷(對於x86平台就是將eflags寄存器的if位置為0),只有當中斷函數被執行 (handle_IRQ_event)的過程中開中斷之後才能有搶占。 對於同種類型的中斷,由於其使亂豎用同樣的idt表項,通過其狀態標志(IRQ_PENDING和 IRQ_INPROGRESS)可以空毀防止同種類型的中斷函數執行(注意:是防止handle_IRQ_event被重入, 而不是防止do_IRQ函數被重入),對於不同的中斷,則可以自由的嵌套。因此,所謂中斷嵌套, 對於不同的中斷是可以自由嵌套的,而對於同種類型的中斷,是不可以嵌套執行的。以下簡單解釋一下如何利斗陪備用狀態標志來防止同種類型中斷的重入:當某種類型的中斷第一次發生時,首先其idt表項的狀態位上被賦予IRQ_PENDING標志,表示有待處理。 然後將中斷處理函數action置為null,然後由於其狀態沒有IRQ_INPROGRESS標志(第一次),故將其狀態置上IRQ_INPROGRESS並去處IRQ_PENDING標志,同時將action賦予相應的中斷處理函數指針(這里是一個重點,linux很巧妙的用法,隨後說明)。這樣,後面就可以順利執行handle_IRQ_event進行中斷處理,當在handle_IRQ_event中開中斷後,如果有同種類型的中斷發生,則再次進入do_IRQ函數,然後其狀態位上加上IRQ_PENDING標志,但是由於前一次中斷處理中加上的IRQ_INPROGRESS沒有被清除,因此這里無法清除IRQ_PENDING標志,因此action還是為null,這樣就無法再次執行handle_IRQ_event函數。從而退出本次中斷處理,返回上一次的中斷處理函數中,即繼續執行handle_IRQ_event函數。當handle_IRQ_event返回時檢查IRQ_PENDING標志,發現存在這個標志,說明handle_IRQ_event執行過程中被中斷過,存在未處理的同類中斷,因此再次循環執行handle_IRQ_event函數。直到不存在IRQ_PENDING標志為止。2.4和2.6的差別,就我來看,主要是在2.6中一進入do_IRQ,多了一個關閉內核搶占的動作,同時在處理中多了一種對IRQ_PER_CPU類型的中斷的處理,其他沒有什麼太大的改變。這類IRQ_PER_CPU的中斷主要用在smp環境下將中斷綁定在某一個指定的cpu上。例如arch/ppc/syslib/open_pic.c中的openpic_init中初始化ipi中斷的時候。 其實簡單的說,中斷可以嵌套,但是同種類型的中斷是不可以嵌套的,因為在IRQ上發生中斷,在中斷響應的過程中,這個IRQ是屏蔽的,也就是這個IRQ的中斷是不能被發現的。 同時在內核的臨界區內,中斷是被禁止的 關於do_IRQ可能會丟失中斷請求:do_IRQ函數是通過在執行完handle_IRQ_event函數之後判斷status是否被設置了IRQ_PENDING標志來判斷是否還有沒有被處理的同一通道的中斷請求。 但是這種方法只能判斷是否有,而不能知道有多少個未處理的統一通道中斷請求。也就是說,假如在第一個中斷請求執行handle_IRQ_event函數的過程中來了同一通道的兩個或更多中斷請求,而這些中斷不會再來,那麼僅僅通過判斷status是否設置了IRQ_PENDING標志不知道到底有多少個未處理的中斷,handle_IRQ_event只會被再執行一次。這算不算是個bug呢? 不算,只要知道有中斷沒有處理就OK了,知道1個和知道N個,本質上都是一樣的。作為外設,應當能夠處理自己中斷未被處理的情況。不可能丟失的,在每一個中斷描述符的結構體內,都有一個鏈表,鏈表中存放著服務例程序關於中斷中使用的幾個重要概念和關系: 一、基本概念 1. 產生的位置 發生的時刻 時序 中斷 CPU外部 隨機 非同步 異常 CPU正在執行的程序 一條指令終止執行後 同步 2.由中斷或異常執行的代碼不是一個進程,而是一個內核控制路徑,代表中斷發生時正在運行的進程的執行 中斷處理程序與正在運行的程序無關 引起異常處理程序的進程正是異常處理程序運行時的當前進程 二、特點 (2)能以嵌套的方式執行,但是同種類型的中斷不可以嵌套 (3)盡可能地限制臨界區,因為在臨界區中,中斷被禁止 2.大部分異常發生在用戶態,缺頁異常是唯一發生於內核態能觸發的異常 缺頁異常意味著進程切換,因此中斷處理程序從不執行可以導致缺頁的操作 3.中斷處理程序運行於內核態 中斷發生於用戶態時,要把進程的用戶空間堆棧切換到進程的系統空間堆棧,剛切換時,內核堆棧是空的 中斷發生於內核態時, 不需要堆棧空間的切換 三、分類 1.中斷的分類:可屏蔽中斷、不可屏蔽中斷 2.異常的分類: 分類 解決異常的方法 舉例 故障 那條指令會被重新執行 缺頁異常處理程序 陷阱 會從下一條指令開始執行 調試程序

Ⅲ 在Linux中,中斷處理程序可以搶占正在執行的有自旋鎖保護的代碼

中斷處理……你說的是GAS匯編的那個么?那個應該可以。

Ⅳ linux send 是可重入函數嗎

可重入函數(即可以被中斷的函數)可以被一個以上的任務調用,而不擔心數據破壞。可重入函數在任何時候都可以被中斷,而一段時間之後又可以恢復運行,而相應的數據不會破壞或者丟失。

可重入函數使用的變數有兩種情況:

1.使用局部變數,變數保存在CPU寄存器中或者堆棧中;

2.使用全局變數,但是這時候要注意保護全局變數(防止任務中斷後被其它任務改變變數)。

?

1

2

3

4

5

void strcpy(*dest,*src)



while(* dest++ = *src ++){;}

*dest = NUL;



分析:上面的函數用於字元串復制,而參數是存放在堆棧中的,故而改函數可以被多任務調用,而不必擔心各個任務調用期間會互相破壞對方的指針。

基本上下面的函數都是不可重入的:

1.函數內使用了靜態的數據。

2.函數內使用了malloc()或者free()函數的。

3.函數內調用了標準的I/O函數的。

?

1

2

3

4

5

6

7

int temp;

void swap(int *ex1,int *ex2)



temp = *ex1;//(1)

*ex1 = *ex2;

*ex2 = temp;



分析:該函數中的全局變數temp是的函數變成了一個不可重入的函數,因為在多任務系統中,假如在任務1中調用swap函數,而程序執行到(1)處時被中斷,進而執行其它的任務2,而剛好任務2也調用了swap函數,則temp里存的值則會被任務2改變。從而回到任務1被中斷處繼續執行的時候,temp里存的值已經不再是原來存的temp值了,進而產生了錯誤。

常用的可重入函數的方法有:

1.不要使用全局變數,防止別的代碼覆蓋這些變數的值。

2.調用這類函數之前先關掉中斷,調用完之後馬上打開中斷。防止函數執行期間被中斷進入別的任務執行。

3.使用信號量(互斥條件)。

總之:要保證中斷是安全的

Ⅳ 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 mv進程被中斷 數據有影響嗎

有影響,雖然 mv 操作是先 cp 再 rm 的,但是這個是針對文件級別進胡尺行操作的。
如果是 mv 文件夾中間被中斷,頌叢則很有可能是有部分文件已完成 cp + rm,部分文野做櫻件只 cp 了一部分,部分文件還沒有被 cp,很少有可能出現部分文件被 rm 到一半中斷的( unlink 操作太快 )
故,如果 mv 文件夾被中斷,則需要繼續 mv 直到完成操作。

Ⅶ linux安裝中斷可以接著裝嗎

可以。
在安裝過程禪森中SSH中斷,核櫻重新連接後,無需重新安裝,輸入screen-rbt即可恢復。
Linux操作系統是基於UNIX操作系統發展而來的一種克隆系統,賀氏畝它誕生於1991年的[Linux桌面]10月5日(這是第一次正式向外公布的時間)。

Ⅷ 連接斷開後,linux程序會繼續運行嗎

不一定,後台執行的可以

Ⅸ linux下用scp傳輸文件 中斷後怎麼進行續傳

scp一旦出錯中斷就只能重新開始,不過可以利用rsync實現scp的斷點續傳
1、在~/.bashrc中加入一個alias:
$vim ~/.bashrc
alias rscp=』rsync -v -P -e ssh』
2、重新載入.bashrc配置
$source ~/.bashrc

windows下面的winscp倒是可以實現斷點續傳!

閱讀全文

與linux中斷會重入么相關的資料

熱點內容
注冊表禁止啟動程序運行 瀏覽:705
網路優化總體流程圖 瀏覽:735
前端程序員簡歷模板 瀏覽:706
蜂巢積木編程機器人怎麼樣 瀏覽:561
微信小程序tips 瀏覽:117
油印文件有哪些 瀏覽:854
java線程買票案例 瀏覽:672
java架構培訓 瀏覽:857
price是什麼文件 瀏覽:258
手機游戲編程哪個好學 瀏覽:259
qq郵箱怎麼發語音文件 瀏覽:494
php刪除資料庫記錄 瀏覽:905
文件校驗工具有哪些 瀏覽:158
蘋果app被亂扣費怎麼投訴 瀏覽:269
數據通信工程師要負責多少設備 瀏覽:904
excel有沒有多個文件數據鏈接 瀏覽:842
鄭州兒童編程課程應該怎麼選擇 瀏覽:103
word2003二級標題編號 瀏覽:370
ipad百度雲盤壓縮文件 瀏覽:912
什麼網站可以發現新產品 瀏覽:680

友情鏈接