window 顯示驅動開發-線性伸縮空間段

線性伸縮空間段類似于線性內存空間段。 但是,伸縮空間段只是地址空間,不能容納位。

若要保存位,必須分配系統內存頁,并且必須重定向地址空間范圍以引用這些頁面。 內核模式顯示微型端口驅動程序(KMD)必須實現 DxgkDdiBuildPagingBuffer 函數,以便DXGK_OPERATION_MAP_APERTURE_SEGMENT和DXGK_OPERATION_UNMAP_APERTURE_SEGMENT操作類型來處理重定向,并且必須按 Display Miniport Driver Driver Driver 的 DriverEntry 中所述公開此函數。 Dxgkrnl 使用要重定向的地址空間范圍和引用已分配的物理系統內存頁的 MDL 調用 DxgkDdiBuildPagingBuffer 。

KMD 通常通過編程頁表(對于視頻內存管理器(VidMm)未知)來實現地址空間范圍的重定向。

驅動程序必須在DXGK_SEGMENTDESCRIPTOR結構的 Flags 成員中設置 Aperture 位字段標志,以指定線性伸縮空間段。 驅動程序還可以設置以下位字段標志來指示其他段支持:

  • CpuVisible 指示該段是 CPU 可訪問的。
  • CacheCoherent 指示該段與段重定向到的頁面的 CPU 保持緩存一致性。

下圖顯示了線性光圈空間段的可視表示形式。

?1. 核心特性

特性說明
虛擬地址空間僅為地址范圍,不包含實際內存(需動態映射物理頁)。
動態重定向通過?DxgkDdiBuildPagingBuffer?將虛擬地址綁定到系統內存頁(MDL 描述)。
CPU 默認可見通常用于 CPU 頻繁訪問的資源(如動態緩沖區)。
緩存一致性可選通過?CacheCoherent?標志保持 CPU-GPU 緩存同步

?2. 段描述符配置(DXGK_SEGMENTDESCRIPTOR)

(1) 基礎配置

DXGK_SEGMENTDESCRIPTOR Segment = {.Flags       = DXGK_SEGMENT_FLAGS_APERTURE, // 聲明為光圈段.BaseAddress = 0x10000000, // 虛擬地址起始.Size        = 0x20000000, // 512MB.SegmentId   = 2, 
};

(2) 可選標志

標志作用適用場景
DXGK_SEGMENT_FLAGS_CPU_VISIBLE允許 CPU 訪問(通常默認啟用)CPU-GPU 共享數據
DXGK_SEGMENT_FLAGS_CACHE_COHERENT強制緩存一致性避免手動刷新緩存(如 ARM GPU)

示例(緩存一致的線性光圈段):

{.Flags       = DXGK_SEGMENT_FLAGS_APERTURE | DXGK_SEGMENT_FLAGS_CACHE_COHERENT,.BaseAddress = 0x30000000,.Size        = 0x10000000, // 256MB.SegmentId   = 3,
}

3. 內存映射流程

(1) 分配虛擬地址范圍

  • 應用程序請求內存(如 ID3D12Resource 創建)。
  • VidMm 選擇伸縮段,分配虛擬地址(GPU VA)。

(2) 物理頁綁定(重定向)
VidMm 調用 DxgkDdiBuildPagingBuffer,傳入:

  • 操作類型:DXGK_OPERATION_MAP_APERTURE_SEGMENT(映射)或 UNMAP(解除映射)。
  • MDL(Memory Descriptor List):描述系統內存物理頁。
  • 虛擬地址范圍:需綁定的 GPU VA。

KMD 實現重定向:

  • 編程 GPU 頁表,將 GPU VA 映射到 MDL 中的物理頁。
  • 若啟用 CACHE_COHERENT,需配置 GPU 緩存策略。

代碼示例(映射操作):

NTSTATUS DxgkDdiBuildPagingBuffer(DXGKARG_BUILDPAGINGBUFFER* pArgs) {if (pArgs->Operation == DXGK_OPERATION_MAP_APERTURE_SEGMENT) {// 獲取 MDL 中的物理頁PHYSICAL_ADDRESS physAddr = MmGetMdlPfnArray(pArgs->pMdl)[0];// 編程 GPU 頁表ProgramGpuPageTable(pArgs->VirtualAddress, physAddr);}return STATUS_SUCCESS;
}

4. 典型應用場景

(1) 動態頂點/索引緩沖區
需求:CPU 每幀更新數據,GPU 讀取。

配置:

{.Flags       = DXGK_SEGMENT_FLAGS_APERTURE | DXGK_SEGMENT_FLAGS_CACHE_COHERENT,.BaseAddress = 0x20000000,.Size        = 0x08000000, // 128MB
}

(2) 分頁資源(Pageable Resources)
需求:按需加載大型紋理。

流程:

  • 初始分配虛擬地址(不綁定物理頁)。
  • 訪問時觸發缺頁中斷,VidMm 調用 DxgkDdiBuildPagingBuffer 動態映射。

(3) 多 GPU 共享資源

  • 需求:數據在多個 GPU 間遷移。
  • 優勢:虛擬地址固定,僅需更新物理頁映射。

5. 驅動開發注意事項

(1) 頁表管理

  • GPU 頁表獨立于 CPU:需驅動自行維護 GPU MMU(內存管理單元)的頁表。
  • TLB 一致性:映射/解除映射后,需無效化 GPU TLB(如通過 DXGK_INVALIDATE_TLB)。

(2) 性能優化

  • 批處理映射操作:合并多次映射請求,減少 GPU 上下文切換。
  • 避免過度分片:盡量分配連續物理頁(減少頁表項數量)。

(3) 錯誤處理

  • 物理頁不足:返回 STATUS_GRAPHICS_INSUFFICIENT_DMA_BUFFER。
  • 非法虛擬地址:驗證 VirtualAddress 是否在段范圍內。

6. 與線性內存空間段的對比

特性線性光圈空間段線性內存空間段
物理內存動態綁定系統內存頁直接分配顯存
地址轉換需 GPU 頁表映射直接訪問(無轉換)
CPU 訪問默認支持需顯式啟用 (CPU_VISIBLE)
性能較低(轉換開銷)高(零開銷)
適用場景CPU 頻繁寫、分頁資源高性能渲染目標

7. 可視化表示

GPU 虛擬地址空間:
0x10000000 ┌───────────────────────┐ ← 光圈段起始(BaseAddress)│   Virtual Range       │ │   (No Physical Memory)│ ├───────────────────────┤ ← 映射操作后│   Mapped to           │ │   System Memory (MDL) │ ← 物理頁動態綁定
0x30000000 └───────────────────────┘ ← 段結束

8. 總結

線性伸縮空間段 = 虛擬地址 + 動態物理頁綁定,適用于需靈活內存管理的場景。

關鍵驅動實現:

  • 處理 DXGK_OPERATION_MAP_APERTURE_SEGMENT/UNMAP 操作。
  • 維護 GPU 頁表,確保地址轉換正確。

優勢:

  • 支持 CPU 高效讀寫。
  • 實現按需分頁和資源共享。

通過合理使用伸縮段,驅動程序可以在保證功能性的同時,優化復雜應用場景下的內存利用率。

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

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

相關文章

Cadence 高速系統設計流程及工具使用三

5.8 約束規則的應用 5.8.1 層次化約束關系 在應用約束規則之前,我們首先要了解這些約束規則是如何作用在 Cadence 設計對象上的。Cadence 中對設計對象的劃分和概念,如表 5-11 所示。 在 Cadence 系統中,把設計對象按層次進行了劃分&#…

ScaleTransition 是 Flutter 中的一個動畫組件,用于實現縮放動畫效果。

ScaleTransition 是 Flutter 中的一個動畫組件,用于實現縮放動畫效果。它允許你對子組件進行動態的縮放變換,從而實現平滑的動畫效果。ScaleTransition 通常與 AnimationController 和 Tween 一起使用,以控制動畫的開始、結束和過渡效果。 基…

深入解析:如何基于開源p-net快速開發Profinet從站服務

一、Profinet協議與軟協議棧技術解析 1.1 工業通信的"高速公路" Profinet作為工業以太網協議三巨頭之一,采用IEEE 802.3標準實現實時通信,具有: 實時分級:支持RT(實時)和IRT(等時實時)通信模式拓撲靈活:支持星型、樹型、環型等多種網絡結構對象模型:基于…

m個n維向量組中m,n的含義與空間的關系

向量的維度與空間的關系&#xff1a; 一個向量的維度由其分量個數決定&#xff0c;例如 ( n ) 個分量的向量屬于 Rn空間 。 向量組張成空間的維度&#xff1a; 當向量組有 ( m ) 個線性無關的 ( n ) 維向量時&#xff1a; 若 ( m < n )&#xff1a; 這些向量張成的是 Rn中的…

excel大表導入數據庫

前文介紹了數據量較小的excel表導入數據庫的方法&#xff0c;在數據量較大的情況下就不太適合了&#xff0c;一個是因為mysql命令的執行串長度有限制&#xff0c;二是node-xlsx這個模塊加載excel文件是整個文件全部加載到內存&#xff0c;在excel文件較大和可用內存受限的場景就…

Python 爬蟲基礎入門教程(超詳細)

一、什么是爬蟲&#xff1f; 網絡爬蟲&#xff08;Web Crawler&#xff09;&#xff0c;又稱網頁蜘蛛&#xff0c;是一種自動抓取互聯網信息的程序。爬蟲會模擬人的瀏覽行為&#xff0c;向網站發送請求&#xff0c;然后獲取網頁內容并提取有用的數據。 二、Python爬蟲的基本原…

Spring Security 深度解析:打造堅不可摧的用戶認證與授權系統

Spring Security 深度解析&#xff1a;打造堅不可摧的用戶認證與授權系統 一、引言 在當今數字化時代&#xff0c;構建安全可靠的用戶認證與授權系統是軟件開發中的關鍵任務。Spring Security 作為一款功能強大的 Java 安全框架&#xff0c;為開發者提供了全面的解決方案。本…

【物聯網】基于樹莓派的物聯網開發【1】——初識樹莓派

使用背景 物聯網開發從0到1研究&#xff0c;以樹莓派為基礎 場景介紹 系統學習Linux、Python、WEB全棧、各種傳感器和硬件 接下來程序貓將帶領大家進軍物聯網世界&#xff0c;從0開始入門研究樹莓派。 認識樹莓派 正面圖示&#xff1a; 1&#xff1a;樹莓派簡介 樹莓派…

第21節:深度學習基礎-激活函數比較(ReLU, Sigmoid, Tanh)

1. 引言 在深度學習領域,激活函數是神經網絡中至關重要的組成部分 它決定了神經元是否應該被激活以及如何將輸入信號轉換為輸出信號 激活函數為神經網絡引入了非線性因素,使其能夠學習并執行復雜的任務 沒有激活函數,無論神經網絡有多少層,都只能表示線性變換,極大地限…

Fiori學習專題三十:Routing and Navigation

實際上我們的頁面是會有多個的&#xff0c;并且可以在多個頁面之間跳轉&#xff0c;這節課就學習如何在不同頁面之間實現跳轉。 1.修改配置文件manifest.json&#xff0c;加入routing&#xff0c;包含三個部分&#xff0c;config,routes,targets; config &#xff1a; routerC…

【HarmonyOS NEXT+AI】問答05:ArkTS和倉頡編程語言怎么選?

在“HarmonyOS NEXTAI大模型打造智能助手APP(倉頡版)”課程里面&#xff0c;有學員提到了這樣一個問題&#xff1a; 鴻蒙的主推開發語言不是ArkTS嗎&#xff0c;本課程為什么使用的是倉頡編程語言&#xff1f; 這里就這位同學的問題&#xff0c;統一做下回復&#xff0c;以方便…

Booth Encoding vs. Non-Booth Multipliers —— 穿透 DC 架構看乘法器的底層博弈

目錄 &#x1f9ed; 前言 &#x1f331; 1. Non-Booth 乘法器的實現原理&#xff08;也叫常規乘法器&#xff09; &#x1f527; 構建方式 ?? 例子&#xff1a;4x4 Non-Booth 乘法器示意 &#x1f9f1; 硬件結構 ? 特點總結 ? 2. Booth Encoding&#xff08;布斯編碼…

GET請求如何傳復雜數組參數

背景 有個歷史項目&#xff0c;是GET請求&#xff0c;但是很多請求還是復雜參數&#xff0c;比如&#xff1a;參數是數組&#xff0c;且數組中每一個元素都是復雜的對象&#xff0c;這個時候怎么傳參數呢&#xff1f; 看之前請求直接是拼接在url后面 類似&items%5B0%5D.…

iOS App 安全性探索:源碼保護、混淆方案與逆向防護日常

iOS App 安全性探索&#xff1a;源碼保護、混淆方案與逆向防護日常 在 iOS 開發者的日常工作中&#xff0c;我們總是關注功能的完整性、性能的優化和UI的細節&#xff0c;但常常忽視了另一個越來越重要的問題&#xff1a;發布后的應用安全。 尤其是對于中小團隊或獨立開發者&…

A* (AStar) 尋路

//調用工具類獲取路線 let route AStarSearch.getRoute(start_point, end_point, this.mapFloor.map_point); map_point 是所有可走點的集合 import { _decorator, Component, Node, Prefab, instantiate, v3, Vec2 } from cc; import { oops } from "../../../../../e…

深度解析動態IP業務核心場景:從技術演進到行業實踐

引言&#xff1a;動態IP的技術演進與行業價值 在數字化轉型加速的今天&#xff0c;IP地址已從單純的網絡標識演變為支撐數字經濟的核心基礎設施。動態IP作為靈活高效的地址分配方案&#xff0c;正突破傳統認知邊界&#xff0c;在網絡安全防護、數據價值挖掘、全球業務拓展等領…

MySQL 性能調優:從執行計劃到硬件瓶頸

MySQL 性能調優&#xff1a;從執行計劃到硬件瓶頸 一、性能調優的宏觀視角與核心挑戰 在數字化浪潮下&#xff0c;企業數據量呈指數級增長&#xff0c;MySQL 作為主流關系型數據庫&#xff0c;面臨著巨大的性能壓力。某電商平臺日均訂單量突破千萬&#xff0c;高峰期數據庫響…

開源數字人框架 AWESOME - DIGITAL - HUMAN:技術革新與行業標桿價值剖析

一、項目核心價值:解鎖數字人技術新境界 1. 技術普及:降低準入門檻,推動行業民主化 AWESOME - DIGITAL - HUMAN 項目猶如一場技術春雨,為數字人領域帶來了普惠甘霖。它集成了 ASR、LLM、TTS 等關鍵能力,并提供模塊化擴展接口,將原本復雜高深的數字人開發流程,轉化為一…

robotframe啟動ride.py

我的雙擊ride.py會自動用pycharm打開&#xff0c;變成代碼文件 解決方法&#xff1a;定位到ride.py所在文件夾&#xff08;在anaconda的scripts里面&#xff09;&#xff0c;文件夾上方輸入cmd 再輸入該命令即可

怎樣簡單實現不同數據庫的表間的 JOIN 運算

數據分析涉及不同業務系統時就要做跨庫計算&#xff0c;而表間 JOIN 是最麻煩的&#xff0c;很多數據庫都不具備這樣的能力&#xff0c;用 Java 取數再計算又太復雜。用 esProc 完成跨庫 JOIN 會簡單很多。 數據與用例 車輛管理系統&#xff08;DB_Vehicle&#xff09;保存了…