window 顯示驅動開發-將虛擬地址映射到內存段(二)

在將虛擬地址映射到段的一部分之前,視頻內存管理器調用顯示微型端口驅動程序的 DxgkDdiAcquireSwizzlingRange 函數,以便驅動程序可以設置用于訪問可能重排的分配位的光圈。 驅動程序既不能將偏移量更改為訪問分配的 PCI 光圈,也不能更改分配在光圈中占用的空間量。 例如,如果驅動程序無法在給定這些約束 (的情況下使分配 CPU 可訪問,則硬件可能耗盡) 不顯眼的光圈,則視頻內存管理器會將分配逐出到系統內存,并允許應用程序訪問其中的位。

如果在用戶模式顯示驅動程序調用 pfnLockCb 函數以請求直接訪問內存時,以前創建的分配的內容位于系統內存中,則視頻內存管理器會將系統內存緩沖區返回到用戶模式顯示驅動程序,并且顯示微型端口驅動程序不涉及訪問分配。 因此,顯示微型端口驅動程序不會修改分配的內容,并且保持為未重排格式。 這意味著,當從視頻內存中逐出 CPU 可訪問的分配時,顯示微型端口驅動程序必須取消重排分配,以便應用程序可以直接訪問生成的系統內存位。

如果逐出與當前映射用于直接應用程序訪問的分配關聯的 GPU 資源,則分配的內容將傳輸到系統內存,以便應用程序可以繼續訪問同一虛擬地址但不同的物理介質上的內容。 為了設置傳輸,視頻內存管理器調用顯示微型端口驅動程序的 DxgkDdiBuildPagingBuffer 函數來創建分頁緩沖區,GPU 計劃程序調用驅動程序的 DxgkDdiSubmitCommand 函數將分頁緩沖區排隊到 GPU 執行單元。 特定于硬件的傳輸命令位于分頁緩沖區中。 有關詳細信息,請參閱 提交命令緩沖區。 視頻內存管理器可確保視頻到系統內存的轉換對應用程序不可見。 但是,驅動程序必須確保通過 PCI 光圈對分配的字節排序與逐出分配時分配的字節順序完全匹配。

對于光圈空間段,分配的基礎位已位于系統內存中,因此無需傳輸 (逐出過程中取消重排) 數據。 因此,如果應用程序直接訪問位于光圈空間段中的 CPU 可訪問分配,則無法重排該分配。

如果某個表面可由應用程序直接通過 CPU 訪問,但將在光圈空間段中重排,則顯示驅動程序應將圖面實現為兩個不同的分配。 當用戶模式顯示驅動程序創建此類圖面時,它可以調用 pfnAllocateCb 函數,并將 D3DDDICB_ALLOCATE 結構的 NumAllocations 成員設置為 2,并將 D3DDDICB_ALLOCATE 的pAllocationInfo 數組中D3DDDI_ALLOCATIONINFO結構的 pPrivateDriverData 成員設置為指向有關分配 (的私有數據,例如其重排格式和未重排格式) 。 GPU 將使用的分配包含重排格式的位,應用程序將訪問的分配包含未重排格式的位。 視頻內存管理器調用顯示微型端口驅動程序的 DxgkDdiCreateAllocation 函數來創建分配。 對于從用戶模式顯示驅動程序傳遞的每個分配) ,顯示微型端口驅動程序解釋DXGK_ALLOCATIONINFO結構的 pPrivateDriverData 成員中的專用數據 (。 視頻內存管理器不知道分配的格式;它只是為分配分配分配特定大小和對齊方式的內存塊。 調用用戶模式顯示驅動程序的 Lock 函數以鎖定圖面進行處理會導致以下操作:

  1. 用戶模式顯示驅動程序調用 pfnRenderCb 函數,將命令緩沖區中的取消重排操作提交到 Direct3D 運行時和顯示微型端口驅動程序。
  2. 用戶模式顯示驅動程序調用 pfnLockCb 函數來鎖定未重排的分配。 請注意,用戶模式顯示驅動程序不得在 D3DDDICB_LOCK 結構的 Flags 成員中設置D3DDDILOCKCB_DONOTWAIT標志。
  3. pfnLockCb 函數將等待傳輸 (在分配之間展開) 。
  4. pfnLockCb 函數請求顯示微型端口驅動程序獲取未重排分配的虛擬地址,并將虛擬地址返回到 D3DDDICB_LOCKpData 成員中的用戶模式顯示驅動程序。
  5. 用戶模式顯示驅動程序將未重排分配的虛擬地址返回到 D3DDDIARG_LOCK 的 pSurfData 成員中的應用程序。

?下圖演示了如何將虛擬地址映射到線性光圈空間段的基礎頁面。

1. 重排分配與 CPU 訪問的沖突

問題背景:
某些圖形分配(如紋理)可能被硬件“重排”(swizzled)以優化 GPU 訪問性能,但這種格式對 CPU 不友好。如果應用程序需要直接通過 CPU 訪問這些分配(如 Lock 操作),則需要取消重排(unswizzle)。

約束條件:

  • 顯示微型端口驅動程序(Display Miniport Driver)在 DxgkDdiAcquireSwizzlingRange 中不能修改 PCI 光圈的偏移或大小。
  • 若硬件無法滿足 CPU 訪問的約束(如光圈空間不足),視頻內存管理器(VidMM)會將分配逐出(evict)到系統內存,并取消重排。

2. 系統內存中的分配訪問

直接訪問系統內存:如果分配已被逐出到系統內存,用戶模式顯示驅動(UMD)通過 pfnLockCb 直接獲取系統內存指針,微型端口驅動不參與,內容保持未重排格式。

關鍵要求:在逐出時,驅動程序必須確保取消重排,使系統內存中的數據是 CPU 可讀的線性格式。

3. GPU 資源逐出與分頁機制

動態逐出處理:
若 GPU 正在使用的分配被逐出(如因內存壓力),VidMM 會通過以下步驟透明遷移數據:

  1. 調用 DxgkDdiBuildPagingBuffer 創建分頁緩沖區(包含硬件特定的傳輸命令)。
  2. 通過 DxgkDdiSubmitCommand 提交到 GPU 執行。
  3. 確保遷移對應用程序透明(虛擬地址不變,物理介質變化)。

數據一致性:驅動程序必須保證 PCI 光圈中的字節順序與逐出時的系統內存完全一致。

4. 光圈空間段的特殊處理

無重排需求:光圈空間段(Aperture Segment)的分配本身位于系統內存,無需重排。若應用程序直接訪問此類分配,驅動程序必須禁止重排。

5. 雙分配策略(重排與非重排共存)

適用場景:
若一個表面需要同時滿足:

  • GPU 訪問(重排格式優化性能)。
  • CPU 訪問(未重排格式保證兼容性)。

實現方式:

  • UMD 調用 pfnAllocateCb 創建 兩個分配(NumAllocations=2),分別存儲重排和未重排數據。
  • 通過 pPrivateDriverData 傳遞格式信息(如重排參數)。
  • 微型端口驅動在 DxgkDdiCreateAllocation 中解析私有數據,管理兩種格式。

Lock 操作流程:

  • UMD 提交命令緩沖區(pfnRenderCb)取消重排(GPU 執行格式轉換)。
  • 調用 pfnLockCb 鎖定未重排的分配(等待轉換完成)。
  • 返回未重排分配的虛擬地址給應用程序。

六、關鍵驅動責任

  1. 格式轉換:在逐出或 Lock 時,確保重排數據轉換為線性格式。
  2. 雙分配管理:維護重排/未重排副本的一致性(如通過 GPU 命令同步)。
  3. 透明性:確保應用程序無感知(虛擬地址不變,物理介質可能變化)。

總結
這段描述揭示了 WDDM 如何平衡 GPU 性能(重排)與 CPU 可訪問性,通過動態逐出、分頁緩沖區、雙分配等機制實現高效內存管理。驅動程序需正確處理重排/取消重排、分頁操作及多副本同步,以滿足圖形和計算應用的多樣化需求。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79542.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79542.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79542.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Termius ssh連接服務器 vim打開的文件無法復制問題

你的問題是: ? 在 Termius (macOS) SSH 連接到 VMware Ubuntu,使用 vim 打開 .cpp 文件時,可以復制文本; ? 但在 Windows 10 上 SSH 到 VMware 的 Red Hat 6.4 時,復制操作無效。 ? 🎯 初步分析 復制…

楊校老師項目之基于SSM與JSP的鮮花銷售系統-【成品設計含文檔】

基于SSMJSP鮮花商城系統 隨著電子商務的快速發展,鮮花在線銷售已成為一種重要的消費模式。本文設計并實現了一個基于JSP技術的鮮花銷售管理系統,采用B/S架構,使用SSM框架進行開發,并結合Maven進行項目依賴管理。系統分為前臺用戶模…

集成學習——Bagging,Boosting

一.什么是集成學習 集成學習的基本思想是通過結合多個基學習器的預測結果,來提高模型的泛化能力和穩定性。這些基學習器可以是相同類型的算法,也可以是不同類型的算法。 當基學習器之間具有一定的差異性時,它們在面對不同的樣本子集或特征子…

【筆試訓練】給一個數組構建二叉樹|從前序遍歷與中序遍歷構建二叉樹|二叉樹中的最大路徑和

文章目錄 1.給一個數組構建二叉樹2.從前序遍歷和中序遍歷構建二叉樹3.二叉樹中的最大路徑和 1.給一個數組構建二叉樹 思路:就是借助一個隊列實現層序遍歷的思想。 先將root節點入隊列,構造左右節點后,root取出來時,將其左右孩子都…

Swift實戰:如何優雅地從二叉搜索樹中挑出最接近的K個值

文章目錄 摘要描述題解答案題解代碼分析示例測試及結果時間復雜度空間復雜度總結未來展望 摘要 在日常開發中,我們經常會遇到“在一堆數據中找出最接近某個值”的需求。尤其在搜索引擎、推薦系統或者地理坐標匹配中,這種“最近匹配”的問題非常常見。Le…

Linux512 ssh免密登錄 ssh配置回顧

下載MX 官網 參考 OK 登個tom試試 然后再計劃登個RealServer 計劃再用僅主機網卡試試 連不上 看來要通過JumpServer再聯 通過網卡訪問 被踢掉了 成功通過跳板機JumpServer登入到RealServer 方法一免密登錄 現計劃嘗試方法二 只有1個tom 我連了兩個tom 看來是根據IP劃…

編譯原理AST以Babel為例進行解讀、Webpack中自定義loader與plugin

AST樹詳解 編譯原理 主要研究如何將高級編程語言的源代碼轉換為機器能理解的目標代碼(通常是二進制代碼或中間代碼)。編譯器的底層實現通常包含多個階段,包括詞法分析、語法分析、語義分析和代碼生成。 一、AST的核心概念與作用 AST&#…

51c大模型~合集127

我自己的原文哦~ https://blog.51cto.com/whaosoft/13905076 #Executor-Workers架構 圖解Vllm V1系列2 本文詳細介紹了vllm v1的Executor-Workers架構,包括Executor的四種類型(mp、ray、uni、external_launcher)及其適用場景&#xff…

《Effective Python》第1章 Pythonic 思維詳解——深入理解流程控制中的解構利器match

《Effective Python》第1章 Pythonic 思維詳解——深入理解流程控制中的解構利器match 引言 Python 3.10 引入了全新的 match 語句,它不僅是一個“類 switch”的語法結構,更是一種**結構化模式匹配(structural pattern matching&#xff09…

Nacos源碼—8.Nacos升級gRPC分析五

大綱 7.服務端對服務實例進行健康檢查 8.服務下線如何注銷注冊表和客戶端等信息 9.事件驅動架構源碼分析 7.服務端對服務實例進行健康檢查 (1)服務端對服務實例進行健康檢查的設計邏輯 (2)服務端對服務實例進行健康檢查的源碼 (3)服務端檢查服務實例不健康后的注銷處理 (…

[手寫系列]Go手寫db — — 完整教程

[手寫系列]Go手寫db ZiyiDB是一個簡單的內存數據庫實現,支持基本的SQL操作,包含create、insert、delete、select、update、drop。目前一期暫支持int類型以及字符類型數據,后續會支持更多數據結構以及能力。本項目基于https://github.com/eato…

十三、動態對象創建(Dynamic Object Creation)

十三、動態對象創建(Dynamic Object Creation) 目錄 13.1 對象創建(Object creation)13.2 new / delete 操作符13.3 數組的 new 與 delete13.4 總結 背景說明 有時候我們需要知道程序中對象的數量、類型和聲明周期,…

一、網絡基礎

IPv4:32位二進制 -- 點分十進制標識 192.168.1.1(連續的32位,為了好看方便每8位一段) IPv6:128位二進制 IP(Internet協議) 洪泛:除流量進入接口外的所有接口的復制 OSI模型&#…

前端面試測試題目(一)

一、Vue的雙向綁定機制(v-model底層實現原理) Vue的雙向綁定核心由 響應式系統 和 指令語法糖 共同實現,具體原理如下: 響應式系統 Vue通過數據劫持和依賴收集實現數據變化到視圖的同步: ? 數據劫持:在Vue…

我用Deepseek + 亮數據爬蟲神器 1小時做出輿情分析器

我用Deepseek 亮數據爬蟲神器 1小時做出輿情分析器 一、前言二、Web Scraper API 實戰(1)選擇對應的URL(2)點擊進入對應url界面(3)API結果實例和爬取結果展示(4)用戶直接使用post請…

機器學習實戰:歸一化與標準化的選擇指南

在機器學習實戰中——是否需要歸一化(Normalization)或標準化(Standardization),取決于所使用的模型類型。 ? LightGBM / XGBoost 是否需要歸一化或標準化? 不需要。 🔧 原因: L…

磁珠特點,原理與應用

什么是磁珠? 磁珠在1930年由日本東京工業大學的加藤與五郎和武井武兩位教授發明,TDK首次生產,是電感的一種,區別就是:電感外面包裹著鐵氧體材質。 因鐵氧體具有高電阻率,低渦流損耗,高頻時依舊…

【連載14】基礎智能體的進展與挑戰綜述-多智能體系統設計

基礎智能體的進展與挑戰綜述 從類腦智能到具備可進化性、協作性和安全性的系統 【翻譯團隊】劉軍(liujunbupt.edu.cn) 錢雨欣玥 馮梓哲 李正博 李冠諭 朱宇晗 張霄天 孫大壯 黃若溪 在基于大語言模型的多智能體系統(LLM-MAS)中,合作目標和合…

React Native踩坑實錄:解決NativeBase Radio組件在Android上的兼容性問題

React Native踩坑實錄:解決NativeBase Radio組件在Android上的兼容性問題 問題背景 在最近的React Native項目開發中,我們的應用在iOS設備上運行良好,但當部署到Android設備時,進入語言設置和隱私設置頁面后應用崩潰。我們遇到了…

[Windows] 網絡檢測工具InternetTest v8.8.2.2503 單文件版_支持查詢IP_DNS_WIFI密碼一鍵恢復

InternetTest(詳情請戳 官網 / 作者項目地址)是一款免費開源的網絡檢測實用工具,其可實現監控、診斷互聯網網絡連接,例如進行 ping 測試、延遲測試、WiFi 密碼查看、IP 地址或域名信息查詢等算是搭建網站及服務器的實用維護工具。…