• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            那誰的技術博客

            感興趣領域:高性能服務器編程,存儲,算法,Linux內核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數據加載中……

            linux內核V2.6.11學習筆記(4)--中斷與異常處理概述

            Linux下面的中斷分兩種:
            同步的中斷,也稱為異常,之所以稱為"同步",是因為這些異常是在程序執行的時候某條語句觸發的,比如除0錯誤,缺頁異常等等,有名的段錯誤也屬于其中的一種,這個時候,你的程序不能繼續往下走,而必須對這些異常做出回應,也就是處理.
            異步的中斷,也就是中斷,之所以稱為"異步",是因為這些中斷是在當前指令之外的指令觸發的.比如你的程序正在執行,來了一個I/O請求,或者定時器到時間被觸發了,等等.也就是說,程序無法預知中斷在什么時候到來.

            有點兒亂了,小結一下:中斷分為兩種,同步的中斷叫做異常,一般由程序中的錯誤觸發;異步的中斷叫做中斷,一般由當前程序外部觸發,比如IO請求,定時器等觸發.

            每一個中斷與一根IRQ線(Interrupt ReQuest (IRQ) line)對應,而IRQ是連接到可編程中斷控制器(Programmable Interrupt Controller,簡稱PIC)上的.它完成下面的工作:
            1) 檢查與之相連的IRQ,看看哪個IRQ被觸發了,選擇最小的被觸發的IRQ.
            2) 將被中斷的IRQ轉換為一個中斷向量
            3) 將中斷向量存放在IO端口,CPU可以通過數據線讀取該中斷向量
            4) 發出INTR指令,告訴CPU:有一條中斷被觸發了
            5) 在以上步驟之后,PIC等待CPU對這個中斷做出響應,這段時間內PIC不會去檢查新的中斷.當CPU處理完這個中斷后,PIC再去清空INTR線以接收新的中斷.
            6) 重復第一步

            以上是PIC所做的,簡單的說:監控IRQ,將被觸發的IRQ轉換為中斷向量,然后通知CPU.

            下面來看看CPU的控制單元是怎么做的.

            <<深入理解Linux內核>>中對這部分說的比較詳細了(4.2.4節),下面做一點輔助解釋性的說明:
            1) 首先,每個中斷向量都與與之對應的處理程序,可以簡單的理解為,這是一個大的數組,數組索引是中斷向量,而存放的元素是函數指針,也就是對這些中斷進行處理的函數.在系統初始化的時候初始化每個中斷向量的處理函數.

            2) 書中的一段話,看著有點兒令人費解的:Before dealing with that instruction, the control unit checks whether an interrupt or an exception occurred while the control unit executed the previous instruction. 實際上,這個查詢操作對程序來說是透明的,是CPU的控制單元自己去做的事情,如果查詢到了有中斷被觸發,再去調用上面已經注冊的處理函數.至于每次執行指令之前是怎么做到高效查找的,我不清楚,哪位知道的麻煩告知一下.

            3)中斷向量的分類為:
            從0~31的向量對應于異常和非屏蔽中斷。

            32~47的向量(即由I/O設備引起的中斷)分配給屏蔽中斷。

            剩余的從48~255的向量用來標識軟中斷。Linux只用了其中的一個(即128或0x80向量)用來實現系統調用。當用戶態下的進程執行一條int 0x80匯編指令時,CPU就切換到內核態,并開始執行system_call(  )內核函數

            4) 由于中斷被觸發時需要保護現場,所以在發生中斷調用處理函數之前需要保護現場,也就是一些寄存器指針;而中斷處理完畢后需要恢復現場,因此需要將這些寄存器恢復.當然,在切換的時候,還需要考慮程序的運行權限等等.


            以上就是對中斷和異常處理的大體流程.

            posted on 2009-04-28 23:28 那誰 閱讀(3354) 評論(3)  編輯 收藏 引用 所屬分類: linux kernel

            評論

            # re: linux內核V2.6.11學習筆記(4)--中斷與異常處理概述  回復  更多評論   

            哥們,提個建議,能不能把字體換成黑色宋體,眼睛好難受
            2009-04-29 08:54 | brightcoder

            # re: linux內核V2.6.11學習筆記(4)--中斷與異常處理概述[未登錄]  回復  更多評論   

            我最近也在看一些linux kernel方面的東西,跟你的內容有點重疊。不過你是比較深入研究代碼,我只是皮毛的看了一些原理。比如我昨天的一些零散的整理:http://timyang.net/linux/linux-process/
            2009-05-04 23:54 | Tim

            # re: linux內核V2.6.11學習筆記(4)--中斷與異常處理概述  回復  更多評論   

            @Tim
            你的blog在我google reader里面,時不時也會去看看,以后請多指教了.
            2009-05-05 00:03 | 那誰
            久久超乳爆乳中文字幕| 久久狠狠爱亚洲综合影院| 99久久99久久久精品齐齐| 国产精品久久久久久福利69堂| 国产V综合V亚洲欧美久久| 久久国产V一级毛多内射| 97久久国产露脸精品国产| 久久99国产精品久久99| 亚洲精品乱码久久久久久不卡| 久久精品毛片免费观看| 久久伊人亚洲AV无码网站| 日产精品99久久久久久| 久久亚洲AV永久无码精品| 91久久精一区二区三区大全| 久久精品无码av| 久久九九有精品国产23百花影院| 婷婷久久五月天| 国产ww久久久久久久久久| 久久无码人妻一区二区三区| 欧美色综合久久久久久| 99久久亚洲综合精品成人| 人妻少妇久久中文字幕| 久久久亚洲AV波多野结衣| 久久精品无码一区二区三区免费| 国产午夜精品理论片久久影视| 狠狠色婷婷久久一区二区 | 中文字幕久久亚洲一区| 久久免费小视频| 99久久免费国产特黄| 人妻精品久久无码专区精东影业| 亚洲精品tv久久久久久久久久| 国产精品99久久精品爆乳| 99久久精品免费看国产免费| 久久久久久久综合日本亚洲| 91精品国产综合久久婷婷| 国产精品久久国产精品99盘| 成人国内精品久久久久一区| 久久国产高清字幕中文| 精品久久一区二区| 99久久婷婷国产一区二区| 久久精品三级视频|