<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 9.6 中斷任務和中斷子程序(Interrupt Tasks and Interrupt Procedures) 和CALL指令能調用一個子程序或任務一樣,中斷、異常也可以“調用”一個子程序或任務來做中斷處理程序。當識別了一個中斷、異常時,處理器使用中斷號來索引IDT。如果處理器索引到的是一個中斷門或陷阱門,它就象CALL指令調用一個調用門一樣調用一個中斷處理子程。如果處理器索引到一個任務門,它就象CALL指令調用了一個任務一樣,做任務切換。 ### 9.6.1 中斷子程序(Interrupt Procedures) 如圖9-4所示,中斷門、陷阱門間接地指向了一個在當前任務上下文里的子程序。門里的選擇子指向了一個在GDT或LDT中的可執行代碼段描述符。偏移部分字段則指向了中斷、異常處理子程序的入口。 80386象使用CALL指令一樣喚醒一個中斷、異常處理子程序。不同之處在下面介紹。 ![](https://box.kancloud.cn/2016-03-06_56dbfdae027fd.gif) 9.6.1.1 中斷子程堆棧(Stack of Interrupt Procedure) 和CALL指令的控制轉移一樣,當控制轉移到中斷、異常處理子程序時,程序使用堆棧來存儲返回被中斷程序的一些信息。如圖9-5所示,中斷時,先把EFLAGS寄存器推入堆棧,然后再是返回地址。 某些類型的異常還可以引起一個出錯碼,出錯碼被壓入堆棧。異常處理程序可以使用出錯碼來幫助排錯。 9.6.1.2 從中斷子程序返回(Returning from an Interrrupt Procedure) 中斷處理程序的返回方式也不和一般的子程序相同。IRET指令用來從中斷子程序中返回。IRET和RET指令相似,只是要增加EIP額外的4個字節(因為在堆棧上的標志)和把保存的標志。只有當CPL為0的時候,標志寄存器的IOPL字段才可以改變。IF標志位只有當CPL&lt;=IOPL時,才會改變。 ![](https://box.kancloud.cn/2016-03-06_56dbfdae13033.gif) 9.6.1.3 被中斷子程使用的標志位(Flags Usage by Interrupt Procedure) 不管是中斷門還是陷阱門,中斷發生,且當前的TF被保存在堆棧上時都會清除TF(陷阱標志)標志位。這樣,處理器就可以在中斷處理程序中禁止用于調試的單步中斷異常。下一個IRET指令將從堆棧上的EFLAGS寄存器映象恢復TF位。 中斷門和陷阱門的主要區別是對于IF(允許中斷標志)標志位的影響。通過中斷門進入中斷處理程序后會清除IF位,從而禁止了其它中斷的發生。其后的IRET指令會恢復IF位到堆棧上的EFLAGS映象。通過陷阱門進入的中斷不改變IF位。 9.6.1.4 在中斷子程序內的保護(Protection in Interrupt Procedures) 對于中斷子程序的特權級規則和普通的子過程調用類似:CPU不允許中斷控制從當前特權級到低特權級。一個試圖破壞這個規則的操作將引起通用保護異常。 因為中斷的發生一般是可預測的,這種特權級的約束著中斷、異常處理程序的執行。以下的方法都可以用來防止這個規則的破壞。 + 把處理程序放到一個一致性段中。這種策略可以處理一些異常(比如,除法錯)。這樣的處理程序只能使用堆棧上的數據。如果它需要在數據段時的數據,數據段應該為特權級3,讓它不被任何保護。 + 把處理程序放在特權級0的段。 ### 9.6.2 中斷任務(Interrupt Tasks) 在IDT中的任務門間接的指向了一個任務,如圖9-6所示。門里的選擇子字段指向了一個GDT中的TSS描述符。 當一個IDT中的中斷、異常向量指向一個任務時,任務切換發生。將中斷用任務來處理有以下兩個好處: + 上下文被完整的自動保存。 + 中斷處理程序可以通過一個完全隔開的地址空間,和其它任務完全隔開,通過了LDT和頁目錄。 處理器的任務切換操作在第7章中已講述。中斷任務通過執行一條IRET指令返回到被中斷的任務。 如果任務切換是被一個帶出錯碼的異常引起的話,處理器將自動壓入出錯碼到中斷任務的第一條指令特權級的對應的堆棧中。 當在80386中的操作系統中使用中斷任務時,實現上就有兩個調度器:一個軟件調度器(操作系統的一部分)和一個硬件調度器(處理器中斷機制的一部分)。軟件調度器設計時應該考慮到,只要中斷允許時,硬件調度器可能在任意時間指派中斷任務。 ![](https://box.kancloud.cn/2016-03-06_56dbfdae619d0.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看