导航菜单

一步步编写操作系统 61 任务状态段 TSS

MG老虎机

0b688f4d81634960ac8d0e15d792949f

I/O位图位于TSS中。它可能存在也可能不存在。它仅用于设置对某些端口的访问权限。没有它,默认情况下禁用对所有端口的访问。因为它可用,TSS的TSS限制(即实际大小-1)不固定。当I/O位图未包含在TSS中时,TSS的大小仅为104字节。话虽如此,当处理器执行一些IO指令时,如果当前权限级别低于IOPL,处理器会认为它可能只是为当前任务释放一些端口,因此它会找到I/O位。 TSS。如图所示,如果I/O位图不存在,即所有端口都被禁止,那么处理器将抛出异常。

在这里阅读,有两个问题需要解决:

处理器在哪里去TSS找到I/O位图?如何证明I/O位图不存在?

在TSS结构中,一个项是“TSS中I/O位图的偏移地址”,在TSS中偏移102个字节,占用2个字节的空间,这是图5-47的左上角。这里,用于存储I/O位图的偏移地址,即地址是TSS中以0开始的I/O位图的偏移量。如果TSS具有I/O位图,则用于保存其偏移地址,如图

所示

7584c476024a4f29acf8e9dc11d89f5b

如图所示,如果TSS中有I/O位图,它将位于TSS的顶部。这就是为什么TSS的实际尺寸不固定的原因。当包含I/O位图时,大小为“I/O位图偏移地址为”+ 8192 + 1个字节。该1字节的结尾是I/O位图中的最后一个0xff。它很长,稍后会解释。如果未包含I/O位图,则其大小最小为104字节。由于I/O位图偏移地址不固定,因此可以大于或等于104,因此在102字节的偏移量与TSS中的I/O位图之间可能存在空闲区域。

你看,由于I/O位图在TSS中,它的地址必须在TSS的大小范围内,即地址范围在TSS偏移量(104~TSS段限制)之间,如果偏移则如果地址不是在此范围内,即大于或等于TSS段限制限制(TSS大小-1),没有I/O位图。

现在为什么在IO位图的末尾有一个0xff?

在计算机系统硬件中,IO端口以字节为单位进行寻址,这意味着端口只能读写1个字节的数据。如果为一个端口连续读取和写入多个字节,则实际上是从端口号开始的多个端口读取。例如,in命令可以读取16位端口数据,即一次读取2个字节,假设端口0x234是16位端口:

在ax,0x234

这相当于

在al,0x234

在啊,0x235

当处理器读写端口时,如果当前权限级别CPL低于IO权限级别IOPL,则如果存在I/O位图,则处理器检查I/O中端口的相应位是否为0位图。如果在端口中读取多个字节,则处理器将不可避免地检查I/O位图中的多个连续端口。这些位必须全为0才能访问它们。

多个连续位可以跨越字节。例如,对应端口0x234的位是前一个字节的最后一位,对应于0x235的位是下一个字节的第0位,因此处理器必须放置这两个字。阅读和处理这些部分。

在大多数情况下,跨字节没有问题,但是当第一位在位图的最后一个字节中时,有一个问题,处理器必须读取多个字节,所以第二位的字该部分是边界,字节不再位于位图范围内。

要解决此问题,处理器要求位图的最后一个字节必须为0xFF。该字节有两个功能:

首先,处理器允许在I/O位图中取消映射所有端口,即I/O位图长度可以小于8KB,但位图的最后一个字节必须是0xFF。如果端口位于位图范围之外,则处理器将始终禁用默认访问。这样,如果位图的最后一个字节的0xFF属于所有65536个端口范围,则每个位的所有字节都表示禁止访问该字节表示的所有端口,这不是故障。

其次,如果字节超出了所有端口的范围,则它不用于映射端口,而是用作位图的边界标记,用于在位图的最后一个字节上“浪涌字节”。避免穿过TSS外的内存。

这就是位图中的最后一个字节必须为0xFF的原因。

您会看到I/O位图。我说它很生动。实际上,我们不使用它。这里的介绍是关于让每个人都知道IO访问如何工作。这只会是有益的。

当我到这里时,特权级别已经完成。本章结束了。友情提醒,我知道这一章还有点多。你已经很累了。现在结束了,所以你可以在这里跳过它。

[续]