Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
A partire da WDDM 2.0, viene usato un modello di segmentazione per astrarre l'accesso gpu alla memoria fisica. Il driver in modalità kernel (KMD) esprime le risorse di memoria fisica disponibili per una GPU enumerando un set di segmenti. Il gestore di memoria video (VidMm) gestisce quindi questi segmenti.
Tipi di segmento
Esistono tre tipi di segmenti:
Segmenti di memoria
Un segmento di memoria rappresenta la memoria dedicata a una GPU. Può trattarsi di VRAM in una GPU discreta o in una memoria riservata del firmware/driver in una GPU integrata. Un driver può enumerare più segmenti di memoria.
A partire da WDDM 2.0, VidMm gestisce un segmento di memoria come pool di pagine fisiche di dimensioni pari a 4 KB o 64 KB. I dati di Surface vengono copiati in e fuori da un segmento di memoria usando le operazioni di paging Fill/Transfer/Discard/FillVirtual/TransferVirtual.
La CPU può accedere al contenuto di un segmento di memoria in uno dei due modi seguenti:
- Un segmento di memoria può essere visibile nello spazio degli indirizzi fisici della CPU, nel qual caso VidMm esegue semplicemente il mapping degli indirizzi virtuali della CPU direttamente alle allocazioni all'interno del segmento.
- A partire da WDDM 2.0, VidMm supporta anche l'accesso al contenuto di un segmento di memoria tramite un'apertura dell'host CPU programmabile associata a tale segmento.
Segmenti dell'apertura
Un segmento di apertura è una tabella globale di pagine utilizzata per far apparire contigue le pagine di memoria di sistema discontinue dal punto di vista di un engine GPU.
In WDDM 2.0 è necessario segnalare un singolo segmento di apertura.
Segmenti di memoria di sistema
Il segmento di memoria di sistema è un segmento implicito che rappresenta i riferimenti alla memoria di sistema, ovvero un indirizzo fisico guest. Il KMD non enumera direttamente un segmento di memoria di sistema.
VidMm enumera in modo implicito e assegna sempre SegmentId==0. Per inserire un'allocazione nel segmento di memoria di sistema, il KMD deve usare l'ID segmento di apertura.
Informazioni di riferimento sulla memoria fisica
Nel DDI, i riferimenti alla memoria fisica assumono sempre la forma di una coppia ID segmento-offset segmento.
Accesso alle allocazioni in base all'indirizzo fisico
I motori GPU che non supportano l'indirizzamento virtuale GPU devono accedere alle allocazioni tramite gli indirizzi fisici. Questo requisito ha implicazioni sul modo in cui un'allocazione ottiene le risorse assegnate da un segmento. I riferimenti fisici implicano che un'allocazione deve essere allocata in modo contiguo in un segmento di memoria o occupa un intervallo contiguo nel segmento di apertura.
Per evitare allocazioni contigue non necessarie e costose, il KmD deve identificare in modo esplicito le allocazioni che richiedono un motore di rendering per accedervi fisicamente. KMD lo fa impostando il flag DXGK_ALLOCATIONINFOFLAGS2::AccessedPhysically durante la creazione dell'allocazione.
Tali allocazioni verranno mappate al segmento di apertura quando risiedono nella memoria di sistema. Le allocazioni saranno contigue quando risiedono in un segmento di memoria. Le allocazioni create in questo modo possono essere referenziate tramite l'elenco delle allocazioni dei motori, che operano in modalità di indirizzamento fisico.
Per le allocazioni che non hanno questo flag impostato, VidMm le allocherà come set di pagine in un segmento di memoria o un set di pagine in memoria di sistema, a cui si accede tramite indirizzi virtuali GPU. Le allocazioni create in questo modo non possono essere referenziate tramite l'elenco di allocazioni. Qualsiasi invio di buffer dei comandi che fa riferimento all'allocazione in questo modo verrà rifiutato.
Le superfici primarie, ovvero le immagini principali visualizzate da un computer, sono accessibili fisicamente dal controller di visualizzazione. Queste superfici verranno allocate in modo contiguo in un segmento di memoria o mappate nel segmento di apertura quando vengono visualizzate. Il KMD deve impostare i flag AccessedPhysically solo quando il motore di rendering accederà fisicamente all'allocazione. La distinzione tra l'accesso fisico implicito sulla superficie primaria e i flag espliciti è quando l'allocazione verrà mappata all'apertura:
Quando il flag AccessedPhysically è impostato, l'allocazione verrà mappata nell’apertura ogni volta che è residente.
Le superfici primarie che non dispongono di questo set di flag verranno mappate all'apertura solo quando vengono visualizzate. Questo approccio consente di rimuovere la pressione sul segmento di apertura. Ciò significa che in genere sono presenti solo alcune superfici primarie da visualizzare attivamente, mentre un numero elevato di esse potrebbe esistere ed essere sottoposto a rendering. Ad esempio, tutte le swapchain FlipEx vengono create come superfici primarie e potenzialmente visualizzabili in scenari dFlip/iFlip.
La tabella seguente riepiloga il modo in cui si accede a diversi tipi di allocazioni all'interno dei segmenti GPU in base ai requisiti di accesso fisico.
| Tipo di segmento | AccessedPhysically==0 | AccessedPhysically==1 | Primary && AccessedPhysically==0 |
|---|---|---|---|
| Segmento di memoria | Insieme di pagine. È consentito solo l'accesso virtuale GPU. | Contiguo. È consentito l'accesso fisico alla GPU | Contiguo. Solo l'accesso virtuale GPU è consentito dai motori di rendering. |
| Segmento Apertura | Non mappato. Pagine di memoria di sistema, mappate solo da tabelle di pagine GPU, non al segmento di apertura. È consentito solo l'accesso virtuale GPU. | Mappato quando residente. L'accesso fisico alla GPU è consentito. | Mappato quando visualizzato. Solo l'accesso virtuale GPU è consentito dai motori di rendering. |