IO许可映射区的最后一位必须是0xFF

IO许可映射区的最后一位必须是0xFF

Content #

I/O 端口是按字节编址的。每个端口仅被设计用来读写一个字节的数据,当以字或者双字访问时,实际上是访问连续的2 个或者4 个端口。

比如,当从端口n 读取一个字时,相当于同时从端口n 和端口n+1 各读取一个字节。下面的代码

in ax, 0x3f8

相当于同时执行

in al, 0x3f8
in ah, 0x3f9  ;仅为示例,x86不允许使用ah寄存器

由于这个原因,当处理器执行一个字或者双字I/O 指令时,会检查许可位串中的 2 个,或者4个连续位,而且要求它们必须都是“0”,否则引发异常中断。

麻烦在于,这些连续的位可能是跨字节的。即,一些位于前一字节,另一些位于后一字节。为此,处理器每次都要从I/O 许可位映射区读两个连续的字节。这种操作方式直接导致了另一个问题。即,如果要检查的比特在最后一字节中,那么,这个两字节的读操作将会越界。

为防止这种情况,处理器要求I/O 许可位映射区的最后必须附加一个额外的字节,并要求它的所有比特都是“1”,即0xFF。当然,它必须位于TSS 的界限之内。

处理器不要求为每一个I/O 端口都提供位映射。对于那些没有在该区域内映射的位,处理器假定它对应的比特是“1”。例如,要是I/O 许可位映射区的长度是 11 字节,那么,除去最后一个所有比特都是“1”的字节,前10 字节映射了80 个端口,分别是端口0 到端口79,访问更高地址的端口将引发异常中断。

From #