我目前正在開發一個業餘操作系統,特別是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,然後在我離開之前將其清除。我認爲這沒有任何作用,但它必須與讀寫特定寄存器有關。