IO许可位串

IO许可位串

Content #

EFLAGS 寄存器的IOPL 位决定了当前任务的I/O 特权级别。如果当前特权级CPL 高于,或者和任务的I/O 特权级IOPL 相同时,即,在数值上, CPL <= IOPL 时,所有I/O 操作都是允许的,针对任何硬件端口的访问都可以通过。

相反,如果当前特权级CPL 低于任务的I/O 特权级IOPL,也并不意味着所有的硬件端口都对当前任务关上了大门。事实上,处理器的意思是总体上不允许,但个别端口除外。至于个别端口是哪些端口,要找到当前任务的TSS,并检索I/O 许可位串。

如图所示,I/O 许可位串(I/O Permission Bit String)是一个比特序列,或者说是一个比特串,最多允许65536 比特,即8KB。从第1 比特开始,各比特用它在串中的位置代表一个端口号。因此,第1 个比特代表0 号端口,第2 个比特代表1 号端口,第3 个比特代表2 号端口,……,第65536 比特代表第65535 号端口。

每个比特的取值决定了相应的端口是否允许访问。为1 时,禁止访问;为0 时,允许访问。处理器检查I/O 许可位的方法是先计算它在I/O 许可位映射区的字节编号,并读取该字节,然后进行测试。比如,当执行指令 out 0x09, al 时,处理器通过计算就可以知道,该端口对应着I/O 许可位映射区第2 个字节的第2 个比特(位1)。于是,它读取该字节,并测试那一位。

From #