<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      《Linux內核設計與實現》讀書筆記(七)- 中斷處理

      中斷處理一般不是純軟件來實現的,需要硬件的支持。通過對中斷的學習有助于更深入的了解系統的一些底層原理,特別是驅動程序的開發。

      主要內容:

      • 什么是中斷
      • 中斷類型
      • 中斷相關函數
      • 中斷處理機制
      • 中斷控制方法
      • 總結

       

      1. 什么是中斷

      為了提高CPU和外圍硬件(硬盤,鍵盤,鼠標等等)之間協同工作的性能,引入了中斷的機制。

      沒有中斷的話,CPU和外圍設備之間協同工作可能只有輪詢這個方法:CPU定期檢查硬件狀態,需要處理時就處理,否則就跳過。

      當硬件忙碌的時候,CPU很可能會做許多無用功(每次輪詢都是跳過不處理)。

       

      中斷機制是硬件在需要的時候向CPU發出信號,CPU暫時停止正在進行的工作,來處理硬件請求的一種機制。

       

      2. 中斷類型

      中斷一般分為異步中斷(一般由硬件引起)和同步中斷(一般由處理器本身引起)。

      異步中斷:CPU處理中斷的時間過長,所以先將硬件復位,使硬件可以繼續自己的工作,然后在適當時候處理中斷請求中耗時的部分。

      舉個例子:網卡的工作原理

      1.     網卡收到數據包后,向CPU發出中斷信號,請求處理接收到的數據包
      2.     CPU將收到的數據包拷貝到內存后,即通知網卡繼續工作
      3.     至于數據包拷貝至內存后的處理會在適當的時候進行

       

      這樣做避免了處理數據包時間過長導致網卡接收數據包速度變慢。

       

      同步中斷:CPU處理完中斷請求的所有工作后才反饋硬件

      舉個例子:系統異常處理(比如運算中的除0操作)

      1.     應用程序出現異常后,需要內核來處理
      2.     內核調用相應的異常處理函數來處理異常
      3.     處理完后終了應用程序或者給出message

       

      同步中斷應該處理能很快完成的一種中斷。

       

      3. 中斷相關函數

      實現一個中斷,主要需要知道3個函數:

      • 注冊中斷的函數
      • 釋放中斷的函數
      • 中斷處理程序的聲明

       

      3.1 注冊中斷的函數

          位置:<linux/interrupt.h>  include/linux/interrupt.h

       

      定義如下:

      /*
       * irg     - 表示要分配的中斷號
       * handler - 實際的中斷處理程序
       * flags   - 標志位,表示此中斷的具有特性
       * name    - 中斷設備名稱的ASCII 表示,這些會被/proc/irq和/proc/interrupts文件使用
       * dev     - 用于共享中斷線,多個中斷程序共享一個中斷線時(共用一個中斷號),依靠dev來區別各個中斷程序
       * 返回值:
       * 執行成功:0
       * 執行失敗:非0
       */
      int request_irq(unsigned int irq,
                      irq_handler_t handler,
                      unsigned long flags,
                      const char* name,
                      void *dev)

       

      3.2 釋放中斷的函數

      定義比較簡單:

      void free_irq(unsigned int irq, void *dev)

      如果不是共享中斷線,則直接刪除irq對應的中斷線。

      如果是共享中斷線,則判斷此中斷處理程序是否中斷線上的最后一個中斷處理程序,

          是最后一個中斷處理程序 -> 刪除中斷線和中斷處理程序

          不是最后一個中斷處理程序 -> 刪除中斷處理程序

       

      3.3 中斷處理程序的聲明

      聲明格式如下:

      /* 
       * 中斷處理程序的聲明
       * @irp  - 中斷處理程序(即request_irq()中handler)關聯的中斷號
       * @dev  - 與 request_irq()中的dev一樣,表示一個設備的結構體
       * 返回值:
       * irqreturn_t -  執行成功:IRQ_HANDLED  執行失敗:IRQ_NONE
       */
      static irqreturn_t intr_handler(int, irq, void *dev)

       

      4. 中斷處理機制

      中斷處理的過程主要涉及3函數:

      • do_IRQ 與體系結構有關,對所接收的中斷進行應答
      • handle_IRQ_event 調用中斷線上所有中斷處理
      • ret_from_intr 恢復寄存器,將內核恢復到中斷前的狀態

       

      處理流程可以參見書中的圖,如下:

      interrupt

       

      5. 中斷控制方法

      常用的中斷控制方法見下表:

      函數

      說明

      local_irq_disable() 禁止本地中斷傳遞
      local_irq_enable() 激活本地中斷傳遞
      local_irq_save() 保存本地中斷傳遞的當前狀態,然后禁止本地中斷傳遞
      local_irq_restore() 恢復本地中斷傳遞到給定的狀態
      disable_irq() 禁止給定中斷線,并確保該函數返回之前在該中斷線上沒有處理程序在運行
      disable_irq_nosync() 禁止給定中斷線
      enable_irq() 激活給定中斷線
      irqs_disabled() 如果本地中斷傳遞被禁止,則返回非0;否則返回0
      in_interrupt() 如果在中斷上下文中,則返回非0;如果在進程上下文中,則返回0
      in_irq() 如果當前正在執行中斷處理程序,則返回非0;否則返回0

       

      總結

      中斷處理對處理時間的要求很高,如果一個中斷要花費較長時間,那么中斷處理一般分為2部分。

      上半部只做一些必要的工作后,立即通知硬件繼續自己的工作。

      中斷處理中耗時的部分,也就是下半部的工作,CPU會在適當的時候去完成。

      posted @ 2013-04-19 11:38  wang_yb  閱讀(10940)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 九九九国产| 91精品国产91热久久久久福利| 最新国产精品好看的精品| 四虎影视一区二区精品| 日本高清中文字幕免费一区二区| 久久精品亚洲热综合一区二区| 粗壮挺进人妻水蜜桃成熟| 国产av无码专区亚洲草草| 国产av一区二区三区精品| 毛片亚洲AV无码精品国产午夜| 少妇被粗大的猛烈进出69影院一| 一区二区三区精品自拍视频 | 安达市| 国产精品一二二区视在线 | 色偷偷亚洲精品一区二区| 99久久亚洲精品无码毛片| 国产熟女一区二区三区蜜臀| 四虎国产精品免费久久久| 日韩在线视频线观看一区 | 日本不卡的一区二区三区| 亚洲产在线精品亚洲第一站一| 97久久精品人人澡人人爽| 色一情一区二区三区四区| 麻豆亚州无矿码专区视频| 石首市| 四虎国产精品永久在线| 丰满无码人妻热妇无码区| 亚洲一区在线观看青青蜜臀| 十九岁的日本电影免费观看| 亚洲色大成网站www永久男同| 国产美女直播亚洲一区色| 亚洲色成人网站www永久四虎| 国产黄色一区二区三区四区| 九九热在线精品视频99| 久久精品欧美日韩精品| 日韩精品福利一区二区三区| 国产MD视频一区二区三区| 亚洲综合精品第一页| 亚洲国产午夜福利精品| 思思久99久女女精品| 最新日韩精品中文字幕|