這兩天被ahci控制器的驅動搞的焦頭爛額,當然主要的問題其實不在軟體,而是fpga上的sata物理層傳輸不夠穩定,現在也沒什麼很好的辦法。先寫一下這兩天看到的系統軟體和ahci控制器硬體互動的三個核心資料結構:cmd_slot / rx_fis / cmd_tbl
上面這張圖是從ahci規範裡面摘出來的,ahci規範裡面定義了在memory中要使用command list、received fis、command table三種資料結構,作為與sata dma進行互動的介面。對應到kernel的ahci驅動**裡,三者的實現分別是cmd_slot陣列、rx_fis、cmd_tbl,其中&cmd_slot[0]、&rx_fis這兩個指標又被儲存在ahci控制器的pxclb、pxfb這兩個暫存器裡。下面參照sata dma在「取命令-按命令操作硬碟-寫回完成狀態」這樣乙個典型操作週期中的行為,來理解上述三個資料結構的作用。
典型操作週期中cpu與sata dma的工作流程如下:
1. cpu inform dma the addressof cmd_slot& rx_fis, andset pxci register
2. dma read cmd_slot, getaddress of cmd_tbl
3. dma read cmd_tbl, getcommand or data
4. dma & sata execute command
5. dma write some completion flag in cmd_slot/ rx_fis/ cmd_tbl
6. dma inform cpu the completion of command(by interrupt)
簡單歸納一下,三個structure的用法是這樣的:cmd_tbl中儲存的是cpu希望sata host對sata device執行的命令及其引數,command table的格式在ata規範裡有詳細的定義;cmd_slot陣列儲存的就是指向若干個(最多32個)cmd_tbl的指標;rx_fis中存的就是記憶體從sata dma接收到的資料幀(關於記憶體將要通過sata dma傳送出去的資料幀的定義和實現在**還不是很清楚,估計應該是command table的某個域),received fis的格式亦在ata規範中被定義了。
sata控制器裡只儲存著cmd_slot的基位址,並不直接儲存cmd_tbl的位址,所以每當cpu通過寫pxci等暫存器向sata控制器發出執行命令的請求後,sata dma會先讀取cmd_slot[i],得到相應的cmd_tbl的位址,然後再讀cmd_tbl,這樣「取命令」階段就完成了。
接下來sata 控制器就會按照命令要求來對硬碟進行操作,比如寫入或讀出,也就是按照某種具體的方式在記憶體和sata device間搬運fis。在命令執行完之後再對cmd_tbl中的某些完成標誌或錯誤標誌進行寫入,最後向cpu發中斷通知這乙個命令週期已經結束。
AHCI驅動中的cmd
這兩天被ahci控制器的驅動搞的焦頭爛額,當然主要的問題其實不在軟體,而是fpga上的sata物理層傳輸不夠穩定,現在也沒什麼很好的辦法。先寫一下這兩天看到的系統軟體和ahci控制器硬體互動的三個核心資料結構 cmd slot rx fis cmd tbl 上面這張圖是從ahci規範裡面摘出來的,a...
AHCI驅動安裝
目錄第 1章windows xp 1 1.1 更新驅動1第 2章windows 7 7 2.1 修改登錄檔 72.2 更新驅動7第 1章windows xp 1.1 更新驅動 裝置管理器中,檢視 ide ata atapi 控制器。筆者電腦有兩個硬碟,因此有 intel r 7 series c21...
WINDOW 7 安裝AHCI驅動的方法和簡單測試
安裝ahci驅動還是有一定的好處的,下面是我的簡單測試結果,每次都執行3遍,取成績最好的一次。安裝驅動前 hd tune pro hitachi hts543225l9sa00 基準測試 測試容量 完全 讀取傳輸率 最低傳輸速率 5.7 mb s 最高傳輸速率 66.0 mb s 平均傳輸速率 47...