<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## 8.3 保護和I/O(Protection and I/O) 有兩種機制用于I/O保護: 1、? FLAGS里的IOPL字段定義了使用I/O指令的特權級。 2、? TSS段里的I/O許可位圖定義了使用I/O地址空間的特權級。 這些機制只在保護模式下工作,包含虛擬8086模式。在實模式中他們不會起作用。在實模式中,I/O空間沒有任何保護。任何子程序可執行I/O指令。任意I/O端口都是可以被I/O指令尋址的。 ### 8.3.1 I/O 特權級(I/O Privilege Level) 處理I/O的指令應該被限制執行,但不在特權級0執行I/O指令也是需要的。所以,處理器用了標志寄存器里的兩位來存儲I/O的特權級(IOPL)。IOPL定義了要執行I/O指令所需要的特權級。 以下指令只有當CPL &lt;= IOPL時才可以執行: ![](https://box.kancloud.cn/2016-03-06_56dbfdae027fd.gif) 這些指令被稱作“敏感指令”,因為他們對I/O敏感的。 為了執行敏感指令,子程序必須執行在至少小于或等于(數值上)IOPL(CPL &lt;= IOPL)的特權級。任何沒有足夠特權級的程序執行I/O指令時將引起通用保護異常。 因為每個任務都有自已的標志寄存器,每個程序都有不同的IOPL。一個任務如果主要任務是完成I/O操作的話(設備驅動程序)可以讓IOPL為3,所以他的任何子程序都可以執行I/O。其它一些程可以把IOPL設成0或1,只讓特權級高的子程序可以執行I/O。 一個任務只有通過POPF指令才能改變IOPL。但是,這樣的改變是特權級的。只有在特權級0執行的程序才可以改變IOPL。不夠特權級的程如果試圖更改IOPL的話,不會產生任何異常,而IOPL只是保持不變。 一條POPF指令可以用來副加的開中斷和關中斷。但是,通過POPF來改變IF標志位也是特權級的。一個想通過POPF指令來改變IF標志的程序,必須要執行在到少IOPL的特權級上(數值上小于或等于)。同樣,不夠特權級的試圖更改并不會產生任何異常,而IF只是保持不變。 ### 8.3.2 I/O 許可位圖(I/O permission Bit Map) 直接指定處理器I/O地址空間的I/O指令是IN,INS,OUT,OUTS。80386可以有選擇性的把一些I/O地址空間訪問設成陷阱。允計這樣做的數據結構是在TSS段(請看圖8-2)中的I/O 許可位圖(I/O Permission Bit Map)I/O許可位圖是一個位向量。位圖的大小是可變的,這個值存放在TSS段中。處理器通過TSS中的位圖基址來定位這個位圖。I/O位圖基址是一個16位寬的字段,包含了I/O許可位圖的偏移。位圖的上限也是TSS段的上限。 在保護模式下,當遇到一條I/O指令時(IN,INS,OUT,或OUTS),處理器首先檢查是否CPL&lt;=IOPL。如果是的話,I/O操作可以繼續。如果不是的話,處理器檢查I/O許可位圖。(在虛擬8086模式,處理器不管IOPL而直接查看位圖,參看第15章) 位圖中的每一位都對應著一個I/O端口字節地址。例如,端口41的位可以在I/O位圖基址+5,位偏移1,處找到。處理器會檢測I/O指令訪問到的每個字節,以看是否允許訪問。例如,一個雙字操作,將測試4位,對應著4個連續的字節地址空間。如果任一個測試是置位的,處理器引發一個通用保護異常。如果所有的測試都有為0,I/O操作被允許。 沒有必要為所有的I/O地址設置I/O許可位圖。沒有被覆蓋到的I/O地址空間,將被假設該位圖對應位已設置為1。例如,如果TSS界限等于I/O位圖基址+31的話,前256的端口被映射。對于更大的端口號作的I/O操作將引起異常。 如果I/O映射位圖基址大于或等于TSS界限的話,TSS段則沒有I/O許可位圖,所以只要當CPL&gt;IOPL時,所有的I/O操作將引起異常。 因為I/O許可位圖在TSS段中,不同的任務有不同的映射位圖。操作系統可以通過修改一個任務的TSS段中的I/O許可位圖,來為某個任務分配端口, ![](https://box.kancloud.cn/2016-03-06_56dbfdae13033.gif)
                  <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>

                              哎呀哎呀视频在线观看