<em id="pn7p8"><acronym id="pn7p8"><u id="pn7p8"></u></acronym></em>

    <th id="pn7p8"></th>

    <button id="pn7p8"></button>

      <dd id="pn7p8"></dd>
      <progress id="pn7p8"><track id="pn7p8"></track></progress>

      Linux培訓
      達內IT學院

      400-111-8989

      Linux 中斷處理原理分析

      • 發布:Linux培訓
      • 來源:Linux教程
      • 時間:2016-09-14 14:29

      一、最簡單的中斷機制

      最簡單的中斷機制就是像芯片手冊上講的那樣,在中斷向量表中填入跳轉到對應處理函數的指令,然后在處理函數中實現需要的功能。類似下圖:

      最簡單的中斷機制

      這種方式在原來的單片機課程中常常用到,一些簡單的單片機系統也是這樣用。

      它的好處很明顯,簡單,直接。

      二、下半部

      中斷處理函數所作的第一件事情是什么?答案是屏蔽中斷(或者是什么都不做,因為常常是如果不清除IF位,就等于屏蔽中斷了),當然只屏蔽同一種中斷。之所以要屏蔽中斷,是因為新的中斷會再次調用中斷處理函數,導致原來中斷處理現場的破壞。即,破壞了 interrupt context。

      隨著系統的不斷復雜,中斷處理函數要做的事情也越來越多,多到都來不及接收新的中斷了。于是發生了中斷丟失,這顯然不行,于是產生了新的機制:分離中斷接收與中斷處理過程。中斷接收在屏蔽中斷的情況下完成;中斷處理在時能中斷的情況下完成,這部分被稱為中斷下半部。

      下半部

      從上圖中看,只看int0的處理。Func0為中斷接收函數。中斷只能簡單的觸發func0,而func0則能做更多的事情,它與funcA之間可以使用隊列等緩存機制。當又有中斷發生時,func0被觸發,然后發送一個中斷請求到緩存隊列,然后讓funcA去處理。

      由于func0做的事情是很簡單的,所以不會影響int0的再次接收。而且在func0返回時就會使能int0,因此funcA執行時間再長也不會影響int0的接收。

      三、軟中斷

      下面看看linux中斷處理。作為一個操作系統顯然不能任由每個中斷都各自為政,統一管理是必須的。

      我們不可中斷部分的共同部分放在函數do_IRQ中,需要添加中斷處理函數時,通過request_irq實現。下半部放在do_softirq中,也就是軟中斷,通過open_softirq添加對應的處理函數。

      軟中斷

      四、tasklet

      舊事物跟不上歷史的發展時,總會有新事物出現。

      隨著中斷數的不停增加,軟中斷不夠用了,于是下半部又做了進化。

      軟中斷用輪詢的方式處理。假如正好是最后一種中斷,則必須循環完所有的中斷類型,才能最終執行對應的處理函數。顯然當年開發人員為了保證輪詢的效率,于是限制中斷個數為32個。

      為了提高中斷處理數量,順道改進處理效率,于是產生了tasklet機制。

      Tasklet采用無差別的隊列機制,有中斷時才執行,免去了循環查表之苦。

      tasklet

      總結下tasklet的優點:

      (1)無類型數量限制;

      (2)效率高,無需循環查表;

      (3)支持SMP機制;

      五、工作隊列

      前面的機制不論如何折騰,有一點是不會變的。它們都在中斷上下文中。什么意思?說明它們不可掛起。而且由于是串行執行,因此只要有一個處理時間較長,則會導致其他中斷響應的延遲。為了完成這些不可能完成的任務,于是出現了工作隊列。工作隊列說白了就是一組內核線程,作為中斷守護線程來使用。多個中斷可以放在一個線程中,也可以每個中斷分配一個線程。

      工作隊列對線程作了封裝,使用起來更方便。

      因為工作隊列是線程,所以我們可以使用所有可以在線程中使用的方法。

      工作隊列

      Tasklet其實也不一定是在中斷上下文中執行,它也有可能在線程中執行。

      假如中斷數量很多,而且這些中斷都是自啟動型的(中斷處理函數會導致新的中斷產生),則有可能cpu一直在這里執行中斷處理函數,會導致用戶進程永遠得不到調度時間。

      為了避免這種情況,linux發現中斷數量過多時,會把多余的中斷處理放到一個單獨的線程中去做,就是ksoftirqd線程。這樣又保證了中斷不多時的響應速度,又保證了中斷過多時不會把用戶進程餓死。

      問題是我們不能保證我們的tasklet或軟中斷處理函數一定會在線程中執行,所以還是不能使用進程才能用的一些方法,如放棄調度、長延時等。

      六、使用方式總結

      Request_irq掛的中斷函數要盡量簡單,只做必須在屏蔽中斷情況下要做的事情。

      中斷的其他部分都在下半部中完成。

      軟中斷的使用原則很簡單,永遠不用。它甚至都不算是一種正是的中斷處理機制,而只是tasklet的實現基礎。

      工作隊列也要少用,如果不是必須要用到線程才能用的某些機制,就不要使用工作隊列。其實對于中斷來說,只是對中斷進行簡單的處理,大部分工作是在驅動程序中完成的。所以有什么必要非使用工作隊列呢?

      除了上述情況,就要使用tasklet。

      即使是下半部,也只是作必須在中斷中要做的事情,如保存數據等,其他都交給驅動程序去做。

      預約申請免費試聽課

      填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

      上一篇:Nginx 負載均衡策略之加權輪詢分析
      下一篇:學習linux從哪開始?

      Linux真正的優勢以及學習方法

      Linux學習路線指南

      Linux的七大認識誤區

      Linux 與 Windows 到底有哪些不同?

      • 掃碼領取資料

        回復關鍵字:視頻資料

        免費領取 達內課程視頻學習資料

      • 視頻學習QQ群

        添加QQ群:1143617948

        免費領取達內課程視頻學習資料

      Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

      選擇城市和中心
      黑龍江省

      吉林省

      河北省

      湖南省

      貴州省

      云南省

      廣西省

      海南省

      高清特黄a大片,日本真人真做爰,特级做人爱C级,免费a级毛片 百度 好搜 搜狗
      <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>