我目前正在开发一个业余操作系统,特别是ATA驱动程序。我遇到了一些PIO数据输入命令与中断问题。我正尝试执行READ MULTIPLE命令,以便逐块读取驱动器中的多个扇区,并为每个块启动中断。什么是确认ATA/IDE中断的正确方法?
如果我请求读取4个块(每块1个扇区)。我期望得到4个中断,每个数据块一个中断。在收到第四个中断后,我可以确定我已经传输了所有数据并相应地更新了我的请求结构。但是,在VirtualBox中,我发现在最后一个数据块被传输后,我又收到另一个中断(STATUS = 0x50,READY,OVERLAPPED MODE SERVER REQ)。我可以简单地读取状态寄存器然后清除它,但我认为根据规格我不会收到第5个中断。
那么什么是正确的方式确认由ATA设备发出的中断?
在这个例子中,我发出读取多个命令,然后我的ISR执行以下操作:
- 禁用CPU中断,将粘
- 读取一个数据块(不是部门!)来回DATA注册,
- 如果所有的数据已被读取,读取状态寄存器以清除“额外”通过清除粘和发送EOI对主机和从太平洋岛国中断
- 退出
PIO数据输入命令协议的ATA规范并不表示您需要以读取状态寄存器。由此我认为,当我收到一个中断时,我所要做的就是按照协议完成并发送EOI给PIC。至于nIEN的设置/清除,在处理VirtualBox时,我发现如果我不这样做,我不会收到第一个中断。所以我在进入ISR时设置了nIEN,然后在我离开之前将其清除。我认为这没有任何作用,但它必须与读写特定寄存器有关。