532628838
圣骑士
圣骑士
  • 注册日期2011-06-10
  • 发帖数98
  • QQ
  • 火币517枚
  • 粉丝77
  • 关注39
阅读:3017回复:0

I/O访问许可检查细节

楼主#
更多 发布于:2011-08-01 16:44
  保护模式下处理器在执行I/O指令时进行许可检查的细节如下所示。
(1)若CPL<=IOPL,则直接转步骤(8);
(2)取得I/O位图开始偏移;
(3)计算I/O地址对应位所在字节在I/O许可位图内的偏移;
(4)计算位偏移以形成屏蔽码值,即计算I/O地址对应位在字节中的第几位;
(5)把字节偏移加上位图开始偏移,再加1,所得值与TSS界限比较,若越界,则产生出错码为0的通用保护故障;
(6)若不越界,则从位图中读对应字节及下一个字节;
(7)把读出的两个字节与屏蔽码进行与运算,若结果不为0表示检查未通过,则产生出错码为0的通用保护故障;
(8)进行I/O访问。
设某一任务的TSS段如下:
TSSSEG                  SEGMENT PARA USE16
                        TSS     <>             ;TSS低端固定格式部分
                        DB      8 DUP(0)       ;对应I/O端口00H—3FH
                        DB      10000000B      ;对应I/O端口40H—47H
                        DB      01100000B      ;对用I/O端口48H—4FH
                        DB      8182 DUP(0ffH) ;对应I/O端口50H—0FFFFH
                        DB      0FFH           ;位图结束字节
TSSLen                  =       $
TSSSEG                  ENDS
再假设IOPL=1,CPL=3。那么如下I/O指令有些能正常执行,有些会引起通用保护异常:
                        in      al,21h  ;(1)正常执行
                        in      al,47h  ;(2)引起异常
                        out     20h,al  ;(3)正常实行
                        out     4eh,al  ;(4)引起异常
                        in      al,20h  ;(5)正常执行
                        out     20h,eax ;(6)正常执行
                        out     4ch,ax  ;(7)引起异常
                        in      ax,46h  ;(8)引起异常
                        in      eax,42h ;(9)正常执行
    由上述I/O许可检查的细节可见,不论是否必要,当进行许可位检查时,80386总是从I/O许可位图中读取两个字节。目的是为了尽快地执行I/O许可检查。一方面,常常要读取I/O许可位图的两个字节。例如,上面的第(8)条指令要对I/O位图中的两个位进行检查,其低位是某个字节的最高位,高位是下一个字节的最低位。可见即使只要检查两个位,也可能需要读取两个字节。另一方面,最多检查四个连续的位,即最多也只需读取两个字节。所以每次要读取两个字节。这也是在判别是否越界时再加1的原因。为此,为了避免在读取I/O许可位图的最高字节时产生越界,必须在I/O许可位图的最后填加一个全1的字节,即0FFH。此全1的字节应填加在最后一个位图字节之后,TSS界限范围之前,即让填加的全1字节在TSS界限之内。
    I/O许可位图开始偏移加8K所得的值与TSS界限值二者中较小的值决定I/O许可位图的末端。当TSS的界限大于I/O许可位图开始偏移加8K时,I/O许可位图的有效部分就有8K字节,I/O许可检查全部根据全部根据该位图进行。当TSS的界限不大于I/O许可位图开始偏移加8K时,I/O许可位图有效部分就不到8K字节,于是对较小I/O地址访问的许可检查根据位图进行,而对较大I/O地址访问的许可检查总被认为不可访问而引起通用保护故障。因为这时会发生字节越界而引起通用保护异常,所以在这种情况下,可认为不足的I/O许可位图的高端部分全为1。利用这个特点,可大大节约TSS中I/O许可位图占用的存储单元,也就大大减小了TSS段的长度。


喜欢0 评分0
游客

返回顶部