2011-09-20 38 views
4

我目前正在开发一个业余操作系统,特别是ATA驱动程序。我遇到了一些PIO数据输入命令与中断问题。我正尝试执行READ MULTIPLE命令,以便逐块读取驱动器中的多个扇区,并为每个块启动中断。什么是确认ATA/IDE中断的正确方法?

如果我请求读取4个块(每块1个扇区)。我期望得到4个中断,每个数据块一个中断。在收到第四个中断后,我可以确定我已经传输了所有数据并相应地更新了我的请求结构。但是,在VirtualBox中,我发现在最后一个数据块被传输后,我又收到另一个中断(STATUS = 0x50,READY,OVERLAPPED MODE SERVER REQ)。我可以简单地读取状态寄存器然后清除它,但我认为根据规格我不会收到第5个中断。

那么什么是正确的方式确认由ATA设备发出的中断?

在这个例子中,我发出读取多个命令,然后我的ISR执行以下操作:

  1. 禁用CPU中断,将粘
  2. 读取一个数据块(不是部门!)来回DATA注册,
  3. 如果所有的数据已被读取,读取状态寄存器以清除“额外”通过清除粘和发送EOI对主机和从太平洋岛国中断
  4. 退出

PIO数据输入命令协议的ATA规范并不表示您需要以读取状态寄存器。由此我认为,当我收到一个中断时,我所要做的就是按照协议完成并发送EOI给PIC。至于nIEN的设置/清除,在处理VirtualBox时,我发现如果我不这样做,我不会收到第一个中断。所以我在进入ISR时设置了nIEN,然后在我离开之前将其清除。我认为这没有任何作用,但它必须与读写特定寄存器有关。

回答

6

这总是发生在我身上,我发表了一个我一直在努力的问题,只是在不久之后才找到答案。

的ATA-6规范我已经参照具有在PIO数据输入部(9.5)这一条线:

当在这种状态中,主机应读出的装置的状态寄存器中。

有了ATA,状态寄存器有一个副作用:它清除待处理的中断。我知道这一点,但我没有正确阅读这部分。它没有提到为什么你应该阅读注册表,它只是说明与上述内容完全相同。

重要的部分是它如何与中断处理程序一起工作。发出PIO数据输入命令后,一旦INTRQ置位,您只需读取一次状态寄存器以清除中断,然后继续处理中断并正常返回(只需将EOI发送给PIC)。我感到困惑的是什么我所读的文档都没有提到它应该如何处理中断(接收INTRQ,读取状态,处理中断)。大多数在线指南只处理轮询IO。

这是低级编程的难点之一,关键细节(例如需要读取ISR中的状态寄存器)通常会被浏览。这个在协议描述中留作一行。打电话给我挑剔,但我只是希望更强调这一点。

相关问题