共用方式為


搭配 DMA 使用直接 I/O

下圖說明 I/O 管理員如何為使用直接 I/O 的 DMA 傳輸作業設定 IRP_MJ_READ 要求。

圖表說明使用 dma 之裝置的使用者緩衝區直接 i/o。

上圖說明驅動程式如何使用 IRP 的 MdlAddress 來傳輸讀取要求的資料。 圖中的驅動程式會使用封包式系統或匯流排主機 DMA,並且具有具有DO_DIRECT_IO的裝置物件的 旗標

  1. 某些使用者空間虛擬位址範圍代表目前線程的緩衝區,而且該緩衝區的內容實際上可能會儲存在上一個圖中 (深色網底的某些數目上) 。 I/O 管理員會建立 MDL 來描述此緩衝區。 MDL 是記憶體管理員所定義的不透明資料結構,可將特定虛擬位址範圍對應至一或多個以頁面為基礎的實體位址範圍。 如需詳細資訊,請參閱 使用 MDL

  2. I/O 管理員會服務目前線程的讀取要求,執行緒會傳遞代表緩衝區的使用者空間虛擬位址範圍。

  3. I/O 管理員或檔案系統驅動程式 (FSD) 會檢查使用者提供的緩衝區是否有協助工具,並使用先前建立的 MDL 呼叫 MmProbeAndLockPagesMmProbeAndLockPages 也會填入 MDL 中對應的實體位址範圍。

    如上圖所示,虛擬範圍的 MDL 可以有數個對應的頁面型實體位址專案,而緩衝區的虛擬範圍可能會從 MDL 所描述的第一頁和最後一頁開始開始和結束。

  4. I/O 管理員會在要求傳輸作業的 IRP 中,提供 MDL (MdlAddress) 指標。 在驅動程式完成 IRP 之後,I/O 管理員或檔案系統呼叫 MmUnlockPages 之前,MDL 中所述的實體頁面會保持鎖定並指派給緩衝區。 不過,這類 MDL 中的虛擬位址可能會變成不可見 (和不正確) ,即使在 IRP 傳送至設備磁碟機之前,還是可能會分層至裝置驅動程式上方的任何中繼驅動程式。

  5. 如果驅動程式使用封包式系統或匯流排主機 DMA,其AdapterControl常式會使用 IRP 的MdlAddress指標呼叫MmGetMdlVirtualAddress,以取得 MDL 頁面型專案的基底虛擬位址。

  6. AdapterControl常式接著會使用MmGetMdlVirtualAddress傳回的基底位址呼叫MapTransfer,以將資料從裝置直接讀取到實體記憶體。 (如需詳細資訊,請參閱 配接器物件和 DMA.)

驅動程式應該一律檢查緩衝區長度。 請注意,I/O 管理員不會為長度為零的緩衝區建立 MDL。