對應暫存器
執行 DMA 的驅動程式會使用三個不同的位址空間,如下圖所示。
在任何 Windows 平臺上,驅動程式都能夠存取處理器所支援的完整虛擬位址空間。 在 32 位處理器上,虛擬位址空間代表四 GB。 CPU 會使用分頁表,將虛擬位址空間中的位址轉譯為系統實體位址空間中的位址。 每個分頁表專案 (PTE) 會將一頁虛擬記憶體對應至實體記憶體頁面,並在必要時產生分頁作業。 MDL (記憶體描述元清單) 為與驅動程式 DMA 作業相關聯的緩衝區提供類似的對應。
裝置會因存取系統的完整虛擬位址空間而有所不同。 裝置會使用邏輯 (裝置) 位址空間中的位址。 每個 HAL 都會使用 地圖暫存器 將裝置或邏輯位址轉譯為實體位址, (實體 RAM) 中的位置。 針對裝置硬體,對應暫存器會執行與 MDL (和分頁表相同的功能,) 軟體 (驅動程式) :它們會將位址轉譯為實體記憶體。
由於這些位址空間是個別定址的,因此驅動程式無法使用虛擬位址空間中的指標來定址實體記憶體中的位置,反之亦然。 驅動程式必須先將虛擬位址轉譯為實體位址。 同樣地,裝置無法使用邏輯位址直接存取實體記憶體。 裝置必須先轉譯位址。
HAL 必須針對不同電腦上的各種 DMA 裝置和 I/O 匯流排設定支援 DMA 的配接器物件。 例如,大部分 ISA DMA 控制器、次級裝置和匯流排主機裝置的位址行不足,無法存取 32 位處理器的完整四 GB 系統實體位址空間 (或 x86 處理器在 36 位 PAE 模式中執行的 64 GB 系統實體位址) 。 相較之下,PCI DMA 裝置通常有足夠的位址行,可存取 32 位處理器中的完整系統實體位址空間。 因此,每個 HAL 都會提供 DMA 裝置可存取的 邏輯位址 範圍與每部電腦的 實體位址 範圍之間的對應。
每個配接器物件都會與一或多個對應暫存器相關聯,視要傳輸的資料量和可用的記憶體數量而定。 在 DMA 傳輸期間,HAL 會使用每個對應暫存器,將裝置可存取的邏輯頁面別名化為 CPU 中實體記憶體的頁面。 實際上,不論其裝置是否有散佈/收集功能,地圖暫存器都會為使用 DMA 的驅動程式提供散佈/收集支援。
下圖說明沒有散佈/收集功能的 ISA DMA 裝置驅動程式的實體對邏輯位址對應。
上圖顯示下列類型的對應:
每個地圖暫存器都會將實體位址範圍對應 (由實線所指向) 到低序邏輯位址 (虛線) ISA DMA 裝置。
在這裡,三個對應暫存器可用來將系統實體記憶體中三頁數據的範圍別名為 ISA DMA 裝置的低序邏輯位址三頁大小範圍。
ISA 裝置會在 DMA 作業期間使用對應的邏輯位址來存取系統記憶體。
針對可比較的 PCI DMA 裝置,三個地圖暫存器也會用於三個頁面大小的資料範圍。 不過,對應的邏輯位址範圍不一定與對應的實體位址範圍相同,因此 PCI 裝置也會使用邏輯位址來存取系統記憶體。
MDL 中的每個專案都會將虛擬位址空間中的位置對應至實體位址。
請注意對應暫存器和 MDL 中虛擬對實體專案之間的對應:
MDL 中的每個對應暫存器和每個虛擬專案最多都會對應 DMA 傳輸作業的完整實體頁面資料。
MDL 中的每個對應暫存器和每個虛擬專案都可能會對應不到完整的資料頁面。 例如,MDL 中的初始虛擬專案可以對應至實體頁面界限的位移,如先前的 實體、邏輯和虛擬位址對應 圖所示。
每個對應暫存器和 MDL 對應中的每個虛擬專案,至少一個位元組。
在要求讀取或寫入作業的 IRP 中, Irp-MdlAddress > 中不透明至驅動程式 MDL 中的每個虛擬專案都代表使用者緩衝區的系統實體記憶體中的頁面界限。 同樣地,單一 DMA 傳輸所需的每個額外對應暫存器都代表裝置可存取邏輯位址範圍中別名為系統實體記憶體的頁面界限。
在每個 Windows 平臺上,每個介面卡物件都有一組相關聯的一或多個對應暫存器,這些暫存器位於平臺特定的 (,以及不透明到驅動程式) 基底位址。 從驅動程式的觀點來看,說明 範例 ISA DMA 裝置位址對應的 圖中所示的地圖暫存器基底是一組可能是晶片、系統 DMA 控制器或匯流排主機介面卡中硬體暫存器的控制碼,甚至可能是系統記憶體中建立的虛擬暫存器。
配接器物件可用的地圖暫存器數目可能會因不同裝置和 Windows 平臺而異。 例如,HAL 可以讓在某些平臺上使用系統 DMA 的驅動程式使用更多對應暫存器,而不是在其他平臺上使用,因為不同 Windows 平臺上的 DMA 控制器具有不同的功能。