2011-09-20 117 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中的狀態寄存器)通常會被瀏覽。這個在協議描述中留作一行。打電話給我挑剔,但我只是希望更強調這一點。

相關問題