直接記憶體儲存 (Direct Memory Access - DMA) 是一種電腦內資料轉送的模式,它不需要中央處理器 (CPU) 的幹涉。
DMA 的工作方式在不同架構的電腦內是以不同的形式被實現的。因此此篇文章將把討論限制在對 IBM 個人電腦 (PC) 和 IBM PC/AT 以及其他所有後繼者和相容產品 的 DMA 子系統的實現以及工作方式上。
PC 的 DMA 子系統是建立在 Intel? 8237 控制器上的。這個 8237 控制器包含 了四個 DMA 通道,每個通道都可以被獨立的編程式控制制而且任何一個通道在任何時候都可以是活動的。這些通道被編號為 0, 1, 2 和 3。從 PC/AT 開始,IBM 加入了第二個 8237 晶片,然後把加入的通道命名為 4, 5, 6 和 7。
原來的 DMA 控制器 (0, 1, 2 和 3) 每次傳輸一個位元組。第二個 DMA 控制器 (4, 5, 6 和 7) 每次傳輸兩個連續記憶體塊內的 16 位元資料,而且前 8 個位元一定是來自一個奇數位的地址。這兩個控制器完全是相同的。傳輸的不同是由第二個控制器串連到系統的方式來決定的。
8237 每個通道有兩種電訊號,叫 DRQ 和 -DACK。還有一些附加的訊號如 HRG (Hold Request),HLDA (Hold Acknowledge),-EOP (End of Process),和匯流排控制信 號 -MEMR (Memory Read),-MEMW (Memory Write),-IOR (I/O Read),和 -IOW (I/O Write)。
8237 DMA 也叫 “fly-by” DMA 控制器。這意味著被傳輸的資料即 不通過 DMA 晶片,也不儲存在 DMA 晶片中。因此,DMA 只能在 I/O 連接埠和記憶體位址 間傳輸資料,而不是在兩個 I/O 連接埠或者兩塊記憶體間。
注意: 8237 允許非 “fly-by” 模式,即串連兩個通道來完成記憶體你到記憶體的資料轉送。但在 PC 工業中沒人使用這種模式,因為在記憶體中移動資料使用 CPU 要更快。
在 PC 架構中,當使用一個給定 DMA 通道的硬體對這個通道發出 DRQ 訊號以後, 這個 DMA 通道才會被啟用。
9.1.1 一個 DMA 傳輸的例子
這個例子展示了 DMA 傳輸的觸發和執行。在這個例子裡,磁碟片控制器 (FDC) 從磁碟片讀入了一個位元組,然後需要 DMA 把這個位元組放到記憶體的 0x00123456 處。整 個過程由 FDC 對 DMA 控制器發出 DRQ2 (對第二個通道發出 DRQ 訊號)訊號開始。
DMA 控制器會注意到接收到了一個 DRQ2訊號。然後控制器會確定第二個 DMA 通道已經被編程而且被標記為 unmasked (開啟)。然後控制器也會確定其他的通道是活動的而且有更高的優先權。一旦這些工作完成,DMA 就要求 CPU 把匯流排放開,以便自己可以使用。DMA 通過匯流排發出 HRQ 訊號直達 CPU。
依靠處理器,CPU 在閒置時候就可以執行一些附加的指令。但是最終 CPU 在執行從內部處理器緩衝或管道讀取內容的命令的時候, 還是要等待。
既然 DMA “取得了管理權”,那麼 DMA 就會啟用 -MEMR,-MEMW, -IOR,-IOW 輸出訊號,來自 DMA 的地址輸出也會被設定為 0x3456。這個輸出將用來引導將被傳輸的位元組到確定的記憶體位址。
DMA 然後讓需求 DMA 傳輸資料的裝置知道傳輸就要開始了。這個開始的訊號 就是 -DACK,如果這個裝置是磁碟片控制器, 那麼就使用 -DACK2 訊號。
磁碟片控制器會負責把要傳輸的位元組放到匯流排資料線上。除非磁碟片控制器需要更多的時間從匯流排上擷取資料(而且,如果外圍裝置的確需要更多的時間,這個裝置會 使用 READY 訊號警告 DMA。),DMA 就會等待一個 DMA 刻度,然後去除掉 -MEMW 和 -IOR 訊號以便記憶體可以關閉和儲存匯流排上的位元組,然後磁碟片控制器就知道 那個位元組已經被傳輸。
因為 DMA 周期一次只傳輸一個位元組,磁碟片控制器現在就會丟掉 DRQ2 訊號, 因此 DMA 就知道這個不再需要了。DMA 也丟掉 -DACK2 訊號,以便磁碟片控制器知道它必須停止往匯流排上傳輸資料。
DMA 會檢查任何一個 DMA 通道有沒有動靜。如果任意通道都沒有 DRQ 訊號,那 麼 DMA 控制器就會第三次發出 -MEMR,-MEMW,-IOR,-IOW 和地址訊號。
最後,DMA 會去掉 HRQ 訊號。CPU 看見這個訊號後,也會去掉 HOLDA 訊號。 然後 CPU 啟用 -MEMR,-MEMW,-IOR,-IOW 和地址資訊,然後再回去執行命令並訪 問記憶體和外圍裝置。
對於一個典型的磁碟片區段,上述過程會重複 512 次,每次一個位元組。每個位元組傳輸的時候,DMA 中的地址寄存器會增加一,顯示還有多少位元組要傳輸的資料計數器則會減一。
當這個計數器變為 0 的時候,DMA 會發出 EOP 訊號,意味著 DMA 知道計數 器為 0,沒有資料需要傳輸了,並等待再次被 CPU 召喚執行其他任務。這個事件也 叫作 終端計數 (Terminal Count, or TC)。只有一個 EOP 訊號,而且,既然每次只 會有一個 DMA 通道是活動的,那麼這個活動的通道就只可能是剛剛完成任務的通道。
當緩衝的傳輸結束以後,如果一個外圍裝置需要發出中斷訊號,就可以實驗一 下把 -DACKn 訊號和 EOP訊號一起發出去。如果有這樣的情況發生,就意味著 DMA 在沒有 CPU 幹預的情況下,不會再給那個裝置傳送任何的資料了。外圍裝置就可以發出中斷訊號來取得處理器的注意。在 PC 架構下,DMA 晶片自己是不能發出中斷訊號的。只有外圍裝置以及相應的硬體才負責發送中斷訊號。因此,就有可能有使用 DMA 而不使用中斷的外圍裝置。
應該懂得,儘管 CPU 在 DMA 需要的時候,總是把匯流排釋放給 DMA,這個動作在應用程式和作業系統裡面是不可見的,只是當 DMA 是活動的時候,CPU 執行指令的時間會有一點點的差別。因此,處理器會不時的探測外圍裝置的狀態,探測 DMA 晶片中的寄存器,或者,當 DMA 傳輸結束的時候,從外圍裝置接收中斷訊號以確定 情況。
9.1.2 DMA 頁面儲存空間和 16 兆位元地址空間限制
可能你早就注意到,我們先前說過 DMA 會把地址線設定為 0x00123456。實際 上 DMA 只設定為 0x3456。這樣做的原因還需要一點點解釋。
當初 IBM PC 被設計出來的時候, IBM 選擇同時使用 DMA 和中斷控制器晶片,後者是專門為 8085 設計的。8085 是一種 8 位元的處理器,地址空間只有16位元 (64K) 。既然 IBM PC 支援超過 64K 的記憶體,就需要做一些工作來讓 DMA 讀寫 64K 標記 以上的記憶體。IBM 的解決方案是給每個 DMA 通道加了一個資料門柵,每個門柵的作用就是儲存每個地址的上半部分以便讀與寫。只要某個 DMA 通道有活動跡象,那個通道的資料門柵所儲存的內容就會被寫到地址匯流排上,並且一直被儲存在那裡直到
DMA 操作結束。IBM 把這種門柵叫作 “頁面寄存器”。
因此,對於上面的例子,DMA 會把 0x3456 處的地址放到匯流排上。然後 DMA 通道2 上的頁面寄存器會把 0x0012xxxx 放到匯流排上。最後,這兩個部分結合到一起構成一個完整的地址以便被訪問。
因為資料寄存器門柵獨立於 DMA 的控制晶片,能夠被讀寫的記憶體就不能跨越 64K 的物理限制。例如,如果 DMA 訪問地址 0xffff,在傳輸結束後 DMA 會增加地址寄存器。然後再去訪問 0x0000,而不是 0x10000。這樣做的後果可能不是故意的。
注意: 不能把 64K 的 “物理” 限制和 8086 模式下的 64K “Segments” 混淆了。後者的存在純粹是附加了一個 segment 寄存 器和一個 offset 寄存器。頁面寄存器沒有地址重疊而且是被 “或” (OR-ed)在 一起的。
更加複雜的是,PC/AT 架構的外部 DMA 地址儲存只有八個位元,一起只有 8+16=24 個位元。這就意味著 DMA 只能定址到 16 兆空間的記憶體。對於新一些的 有超過 16 兆記憶體的電腦,標準的 PC 相容的 DMA 不能訪問高於 16 兆的內 存。
要繞過這個限制,作業系統在記憶體中保留了一個緩衝,這個緩衝的地址小於 16 兆,而且這個緩衝的大小不超過 64 K。然後 DMA 會被編程從外部裝置傳送資料到這個緩衝,作業系統則把資料從這個緩衝傳送到資料的真正目的地。
當把資料從高於 16 兆的地址傳送到外設的時候,資料首先被複製到一個 低於 16 兆地址的緩衝,然後 DMA 就可以把這個資料傳送到外部的硬體。在 FreeBSD 中,這些保留的緩衝叫作 “Bounce Buffers”。在 MS-DOS? 的世界裡,這些緩衝則叫作 “Smart Buffers”。
注意: 一種新的 8237 的實現,叫作 82374,允許 16 bit 的頁面寄存器而且可以 訪問 32 bit 地址空間。不需要中繼緩衝(bounce buffers)。
9.1.3 DMA 操作模式和設定
8237 DMA 可以在不同的模式下操作。主要的有:
-
Single
-
一個 byte (或者 word)被傳輸。DMA 必須釋放然後再次擷取匯流排來 完成每一個 byte。通常是那些不能一次傳輸一整塊資料的裝置使用的模式。 這種外設在每次傳輸的時候都會聯絡 DMA。
標準的 PC 相容的磁碟片控制器(NEC 765)只有一個 1 byte 大小的緩衝,因此它需要這種模式。
-
Block/Demand
-
一旦 DMA 擷取系統匯流排,一整塊資料將被傳輸,直到 64K 的上限。如果外部裝置需要額外的時間,外設可以簡單傳送一個 READY 訊號掛起資料的 傳送。READY 不能過多的使用,對於速度慢的外部裝置,就應該選擇 Single Transfer Mode。
Block 和 Demand 的區別就是:一旦一個資料區塊 (Block) 的傳輸開始,就會一直持續到傳輸記數器到 0 為止。DRQ 只需要在 -DACK 發送以後再發送。 Demand 模式中,DRQ 發送後,此時 DMA 會把資料轉送掛起,釋放匯流排給 CPU。 再次發送 DRQ 後,被掛起的傳輸將繼續。
老舊的硬碟控制器使用 Demand 模式,這種情況一直持續到 CPU 發展 到足夠快以至於用 CPU 控制傳輸資料更有效率。特別是如果傳輸資料用的內 存位置在 16 兆以上。
-
Cascade
-
這種機制允許 DMA 通道請求控制匯流排,但是隨後接入的外設將負責把地址控制資訊放到匯流排上,而不是 DMA 自己。這也可以用來實現 “Bus Mastering”。
在 Cascade 模式下,DMA 通道接受匯流排控制權,但不會把地址和 I/O 控制訊號發送到匯流排,就像 DMA 通常在活動情況下那樣。相反,DMA 只會發 送 -DACK 訊號給活動的 DMA 通道。
在這個時候是串連到這個活動 DMA 通道的外部裝置發出地址和匯流排控制資訊。此外部裝置對匯流排有絕對的控制權,而且對 16 兆位元地址以下的地址有讀和或者寫的權力。當外設的任務完成,就停止發送 DRQ 訊號,然後 DMA 控制器把控制權返回給 CPU 或者其他的 DMA 通道。
Cascade 模式可以用來把多個 DMA 控制器連結在一起,而且這正好就 是 PC 架構中 DMA 通道 4 的用途。當一個外設在 DMA 通道 0,1,2,3 上 請求使用匯流排,從屬 DMA 控制器就發送 HLDREQ,但這個訊號是發往 主 DMA 控制 器上而不是 CPU 上的。主 DMA 控制器認為在通道 4 上有工作要做,就用 HLDREQ 訊號向 CPU 請求使用匯流排。一旦 CPU 把匯流排控制權交給主 DMA 控制器,-DACK 訊號就被發送了,然後直接送到從屬
DMA 控制器激發 HLDA 信 號。從屬 DMA 控制器就把資料發送給需要的 DMA 通道 (0, 1 2 或 3),或者 從屬 DMA 控制器可以把匯流排控制權轉讓給想要的外設,例如 SCSI 控制器。
由於這種串連操作,在 PC/AT 系統中只有 DMA 通道 0,1,2,3,5, 6 和 7 是可以使用的。
注意: 在早期的 IBM PC 電腦中,DMA 通道 0 專門執行重新整理操作。
當外部裝置控制系統匯流排的時候,重要的是外設一定要持續不斷的傳輸資料。如果不能持續不斷,外設就必須經常釋放匯流排以便系統能重新整理主存。
所有 PC 記憶體使用量的揮發性 RAM 必須被經常性的訪問以便讓儲存在裡 面一些資料保持 “charged” 的狀態。揮發性記憶體主要由上百萬個電容組成,每個電容裡面存貯了一個位元的資料。這些電容充滿電錶示
1, 而沒電的時候表示 0。因為所有的電容都會漏電,就必 須不斷的給電容充電讓所有的 1 不變。實際上這個工作是 RAM 的晶片來執行的。但是系統的其他部分必須讓 RAM 晶片知道何時該做這個工作,以便系統能夠正常的訪問記憶體。如果電腦不能重新整理記憶體,記憶體中的資料將在很短的時間內崩潰。
因為記憶體讀寫迴圈 “算”重新整理迴圈(一個動態 RAM 重新整理實際上是一個不完整的記憶體讀操作),只要外部控制器繼續讀或寫資料到連續的記憶體位址,就會重新整理整個記憶體。
匯流排控制在一些 SCSI 裝置和高效能外部控制器上可以找到。
-
Autoinitialize
-
這個模式將導致 DMA 進行 位元組,塊,或者 需求 傳輸操作,但是當 DMA 傳輸計數器為 0 的時候,計數器和地址都會被設定為 DMA 被編程時的初始狀態。這就意味著只要外設要求傳輸資料,就會被授權。
在只有小的硬體 “取樣” 緩衝或者沒有硬體緩衝的音頻 裝置上這種方法經常使用。要處理 “迴圈”緩衝會加重 CPU 的 負擔,但是在某些情況下當 DMA 計數器為 0 而且 DMA 停止傳輸被再次編程 的時候,這是唯一消除延遲的方法。
9.1.4 DMA 編程
被編程的 DMA 通道在裝載任何設定之前應該總是被“屏蔽”。因為硬體可能會意想不到的給那個通道發送 DRQ 訊號,而且 DMA 會回應,甚至在全部參數還沒有被裝載或者更新之前。
一旦被屏蔽,主機必須指出資料轉送的方向(記憶體到 I/O 或者 I/O 到記憶體), DMA 操作使用什麼模式(Single, Block, Demand, Cascade 等等),而且最後還要明確地址和資料的長度。資料的長度比你希望 DMA 傳輸的資料的長度要短。地址和 資料長度的 LSB 和 MSB被寫到同一個 8位元的 I/O 連接埠,因此另一個必須被提前 寫入資料以保證 DMA 能接受第一個位元組為 LSB 而第二個位元組為 MSB。
然後,確認更新頁面計數器,這個計數器不在 DMA 裡面而且也必須從不同的 I/O 連接埠去訪問。
一旦所有的設定準備好了,DMA 通道就會被開啟。DMA 通道已經被確認 “武裝”好了,將回應通道上傳來的 DRQ 訊號。
請參考硬體資料書籍以獲得詳細的 8237 編程細節。可能你還要參考一些 PC 系統 I/O 連接埠映射的資料。這些資料描述了 DMA 和頁面寄存器的具體位置。以下是一個完整的連接埠映射表格。
9.1.5 DMA 連接埠映射
所有基於 IBM-PC 和 PC/AT 的系統的 DMA 都位於相同的 I/O連接埠。以下是一個完整的列表。在非 AT 的設計中的 DMA 控制器 2 使用的連接埠是未定義的。
9.1.5.1 0x00-0x1f DMA 控制器 1 (通道 0, 1, 2 和 3)
DMA 地址和計數寄存器
0x00 |
寫 |
通道 0 開始地址 |
0x00 |
讀 |
通道 0 目前地址 |
0x01 |
寫 |
通道 0 初始字數統計 |
0x01 |
讀 |
通道 0 剩餘字數統計 |
0x02 |
寫 |
通道 1 開始地址 |
0x02 |
讀 |
通道 1 目前地址 |
0x03 |
寫 |
通道 1 初始字數統計 |
0x03 |
讀 |
通道 1 剩餘字數統計 |
0x04 |
寫 |
通道 2 開始地址 |
0x04 |
讀 |
通道 2 目前地址 |
0x05 |
寫 |
通道 2 初始字數統計 |
0x05 |
讀 |
通道 2 剩餘字數統計 |
0x06 |
寫 |
通道 3 開始地址 |
0x06 |
讀 |
通道 3 目前地址 |
0x07 |
寫 |
通道 3 初始字數統計 |
0x07 |
讀 |
通道 3 剩餘字數統計 |
DMA 指令寄存器
0x08 |
寫 |
指令寄存器 |
0x08 |
讀 |
狀態寄存器 |
0x09 |
寫 |
需求寄存器 |
0x09 |
讀 |
- |
0x0a |
寫 |
單屏蔽寄存位元位 |
0x0a |
讀 |
- |
0x0b |
寫 |
模式寄存器 |
0x0b |
讀 |
- |
0x0c |
寫 |
清除 LSB/MSB Flip-Flop |
0x0c |
讀 |
- |
0x0d |
寫 |
主 清除/重設 |
0x0d |
讀 |
臨時寄存器 (在較新的版本中沒有) |
0x0e |
寫 |
清除屏蔽寄存器 |
0x0e |
讀 |
- |
0x0f |
寫 |
寫入所有屏蔽寄存器位元位 |
0x0f |
讀 |
讀出所有屏蔽寄存器位元位 (只有 Intel 82374 有) |
9.1.5.2 0xc0-0xdf DMA 控制器 2 (通道 4, 5, 6 和 7)
DMA 地址和計數寄存器
0xc0 |
寫 |
通道 4 開始地址 |
0xc0 |
讀 |
通道 4 目前地址 |
0xc2 |
寫 |
通道 4 初始字數統計 |
0xc2 |
讀 |
通道 4 剩餘字數統計 |
0xc4 |
寫 |
通道 5 開始地址 |
0xc4 |
讀 |
通道 5 目前地址 |
0xc6 |
寫 |
通道 5 初始字數統計 |
0xc6 |
讀 |
通道 5 剩餘字數統計 |
0xc8 |
寫 |
通道 6 開始地址 |
0xc8 |
讀 |
通道 6 目前地址 |
0xca |
寫 |
通道 6 初始字數統計 |
0xca |
讀 |
通道 6 剩餘字數統計 |
0xcc |
寫 |
通道 7 開始地址 |
0xcc |
讀 |
通道 7 目前地址 |
0xce |
寫 |
通道 7 初始字數統計 |
0xce |
讀 |
通道 7 剩餘字數統計 |
DMA 指令寄存器
0xd0 |
寫 |
指令寄存器 |
0xd0 |
讀 |
狀態 |
0xd2 |
寫 |
需求寄存器 |
0xd2 |
讀 |
- |
0xd4 |
寫 |
單屏蔽寄存器位元位 |
0xd4 |
讀 |
- |
0xd6 |
寫 |
模式寄存器 |
0xd6 |
讀 |
- |
0xd8 |
寫 |
清除 LSB/MSB Flip-Flop |
0xd8 |
讀 |
- |
0xda |
寫 |
主 清除/重設 |
0xda |
讀 |
臨時寄存器 (Intel 82374 沒有) |
0xdc |
寫 |
清楚屏蔽寄存器 |
0xdc |
讀 |
- |
0xde |
寫 |
寫所有屏蔽寄存器位元位 |
0xdf |
讀 |
讀所有屏蔽寄存器位元位 (只有 Intel 82374 有) |
9.1.5.3 0x80-0x9f DMA 頁面寄存器
0x87 |
讀/寫 |
通道 0 低位 (23-16) 頁面寄存器 |
0x83 |
讀/寫 |
通道 1 低位 (23-16) 頁面寄存器 |
0x81 |
讀/寫 |
通道 2 低位 (23-16) 頁面寄存器 |
0x82 |
讀/寫 |
通道 3 低位 (23-16) 頁面寄存器 |
0x8b |
讀/寫 |
通道 5 低位 (23-16) 頁面寄存器 |
0x89 |
讀/寫 |
通道 6 低位 (23-16) 頁面寄存器 |
0x8a |
讀/寫 |
通道 7 低位 (23-16) 頁面寄存器 |
0x8f |
讀/寫 |
低位頁面重新整理 |
9.1.5.4 0x400-0x4ff 82374 增強 DMA 寄存器
Intel 82374 EISA 系統組件 (ESC) 在 1996 年出現,並在一個單一的包 中包括了 8237 功能的超集和其他相容 PC 的核心組件。這個晶片致力於 EISA 和 PCI 平台,也提供現代的 DMA 特性,像 scatter-gather,環形緩衝,系統級 DMA 對所有 32 位元地址空間的直接存取。
如果這些特性被使用,就必須附上代碼給前 16 年的那些相容 PC 的電腦提供類似地功能。為了相容,必須在為每次傳輸給傳統的 8237 寄存器編程之後給 82374 編程。向一個傳統的 8237 寄存器寫入資料將迫使某些 82374 增強型寄存器內容被清零以便提供向後軟體相容。
0x401 |
讀/寫 |
通道 0 高位 (bits 23-16) 字數統計 |
0x403 |
讀/寫 |
通道 1 高位 (bits 23-16) 字數統計 |
0x405 |
讀/寫 |
通道 2 高位 (bits 23-16) 字數統計 |
0x407 |
讀/寫 |
通道 3 高位 (bits 23-16) 字數統計 |
0x4c6 |
讀/寫 |
通道 5 高位 (bits 23-16) 字數統計 |
0x4ca |
讀/寫 |
通道 6 高位 (bits 23-16) 字數統計 |
0x4ce |
讀/寫 |
通道 7 高位 (bits 23-16) 字數統計 |
0x487 |
讀/寫 |
通道 0 高位 (bits 31-24) 頁面寄存器 |
0x483 |
讀/寫 |
通道 1 高位 (bits 31-24) 頁面寄存 |
0x481 |
讀/寫 |
通道 2 高位 (bits 31-24) 頁面寄存 |
0x482 |
讀/寫 |
通道 3 高位 (bits 31-24) 頁面寄存 |
0x48b |
讀/寫 |
通道 5 高位 (bits 31-24) 頁面寄存 |
0x489 |
讀/寫 |
通道 6 高位 (bits 31-24) 頁面寄存 |
0x48a |
讀/寫 |
通道 6 高位 (bits 31-24) 頁面寄存 |
0x48f |
讀/寫 |
高位頁面重新整理 |
0x4e0 |
讀/寫 |
通道 0 停止寄存器 (bits 7-2) |
0x4e1 |
讀/寫 |
通道 0 停止寄存器 (bits 15-8) |
0x4e2 |
讀/寫 |
通道 0 停止寄存器 (bits 23-16) |
0x4e4 |
讀/寫 |
通道 1 停止寄存器 (bits 7-2) |
0x4e5 |
讀/寫 |
Channel 1 Stop Register (bits 15-8) |
0x4e6 |
讀/寫 |
通道 1 停止寄存器 (bits 23-16) |
0x4e8 |
讀/寫 |
通道 2 停止寄存器 (bits 7-2) |
0x4e9 |
讀/寫 |
通道 2 停止寄存器 (bits 15-8) |
0x4ea |
讀/寫 |
通道 2 停止寄存器 (bits 23-16) |
0x4ec |
讀/寫 |
通道 3 停止寄存器 (bits 7-2) |
0x4ed |
讀/寫 |
通道 3 停止寄存器 (bits 15-8) |
0x4ee |
讀/寫 |
通道 3 停止寄存器 (bits 23-16) |
0x4f4 |
讀/寫 |
通道 5 停止寄存器 (bits 7-2) |
0x4f5 |
讀/寫 |
通道 5 停止寄存器 (bits 15-8) |
0x4f6 |
讀/寫 |
通道 5 停止寄存器 (bits 23-16) |
0x4f8 |
讀/寫 |
通道 6 停止寄存器 (bits 5-2) |
0x4f9 |
讀/寫 |
通道 6 停止寄存器 (bits 15-8) |
0x4fa |
讀/寫 |
通道 6 停止寄存器 (bits 23-16) |
0x4fc |
讀/寫 |
通道 7 停止寄存器 (bits 7-2) |
0x4fd |
讀/寫 |
通道 7 停止寄存器 (bits 15-8) |
0x4fe |
讀/寫 |
通道 7 停止寄存器 (bits 23-16) |
0x40a |
寫 |
通道 0 至 3 連結模式寄存器 |
0x40a |
讀 |
通道中斷狀態寄存器 |
0x4d4 |
寫 |
通道 4 至 7 連結模式寄存器 |
0x4d4 |
讀 |
連結模式狀態 |
0x40c |
讀 |
鏈式緩衝到期控制寄存器 |
0x410 |
寫 |
通道 0 Scatter-Gather 指令控制器 |
0x411 |
寫 |
通道 1 Scatter-Gather 指令控制器 |
0x412 |
寫 |
通道 2 Scatter-Gather 指令寄存器 |
0x413 |
寫 |
通道 3 Scatter-Gather 指令寄存器 |
0x415 |
寫 |
通道 5 Scatter-Gather 指令寄存器 |
0x416 |
寫 |
通道 6 Scatter-Gather 指令寄存器 |
0x417 |
寫 |
通道 7 Scatter-Gather 指令寄存器 |
0x418 |
讀 |
通道 0 Scatter-Gather 狀態寄存器 |
0x419 |
讀 |
通道 1 Scatter-Gather 狀態寄存器 |
0x41a |
讀 |
通道 2 Scatter-Gather 狀態寄存器 |
0x41b |
讀 |
通道 3 Scatter-Gather 狀態寄存器 |
0x41d |
讀 |
通道 5 Scatter-Gather 狀態寄存器 |
0x41e |
讀 |
通道 5 Scatter-Gather 狀態寄存器 |
0x41f |
讀 |
通道 7 Scatter-Gather 狀態寄存器 |
0x420-0x423 |
讀/寫 |
通道 0 Scatter-Gather 描述符表指標寄存器 |
0x424-0x427 |
讀/寫 |
通道 1 Scatter-Gather 描述符表指標寄存器 |
0x428-0x42b |
讀/寫 |
通道 2 Scatter-Gather 描述符表指標寄存器 |
0x42c-0x42f |
讀/寫 |
通道 3 Scatter-Gather 描述符表指標寄存器 |
0x434-0x437 |
讀/寫 |
通道 5 Scatter-Gather 描述符表指標寄存器 |
0x438-0x43b |
讀/寫 |
通道 6 Scatter-Gather 描述符表指標寄存器 |
0x43c-0x43f |
讀/寫 |
通道 7 Scatter-Gather 描述符表指標寄存器 |