我目前正在开发一个爱好操作系统,特别是 ATA 驱动程序。我在使用带有中断的 PIO 数据输入命令时遇到了一些问题。我正在尝试执行 READ MULTIPLE 命令以逐块读取驱动器中的多个扇区,并为每个块触发一个中断。
如果我请求读取 4 个块(每块 1 个扇区)。我希望得到 4 个中断,每个数据块一个。在收到第四次中断后,我可以确定我已经传输了所有数据并相应地更新了我的请求结构。但是,在 VirtualBox 中,我发现在传输最后一个数据块后,我收到了另一个中断(状态 = 0x50,就绪,重叠模式服务器请求)。我可以简单地读取状态寄存器然后将其清除,但我认为根据规范我不应该收到第 5 个中断。
那么,什么是正确的方法来确认 ATA 设备发出的中断呢?
在这个例子中,我发出一个 READ MULTIPLE 命令,然后我的 ISR 执行以下操作:
- 禁用 CPU 中断,设置 nIEN
- 从 DATA 寄存器读取单个数据块(不是扇区!),
- 如果已读取所有数据,则读取 STATUS 寄存器以清除“额外”中断
- 通过清除 nIEN 退出,并向主从 PIC 发送 EOI
PIO 数据输入命令协议的 ATA 规范并不表示您需要读取状态寄存器。由此我假设当我收到中断时,我所要做的就是遵循协议并通过将 EOI 发送到 PIC 来完成。至于 nIEN 的设置/清除,在处理 VirtualBox 时,我发现如果我不这样做,我不会收到任何超过第一个中断的中断。所以我在进入ISR的时候设置了nIEN,然后在我离开之前清除它。我认为这不会有任何影响,但它必须与读取/写入该特定寄存器有关。