GPU yarı sanallaştırma

Bu makalede WDDM'de GPU sanallaştırması açıklanmaktadır. Bu özellik Windows 10, sürüm 1803 (WDDM 2.4) sürümünden itibaren kullanılabilir.

GPU sanallaştırma hakkında

GPU sanallaştırma, hem Windows İstemcisi hem de Windows Server için önemli bir özelliktir. Sanal makinede GPU kaynaklarının etkili bir şekilde kullanılmasını gerektiren birçok senaryo vardır.

Sunucu senaryoları (konak işletim sisteminin kullanıcı uygulamalarını çalıştırmadığı durumlar) şunlardır:

  • Masaüstü sanallaştırma
  • Hesaplama (AI, ML vb.)

İstemci senaryoları (konak işletim sisteminin VM'ler ve kullanıcı uygulamaları arasında GPU'ları paylaştığı) şunları içerir:

  • Grafik uygulamaları geliştirme ve test etme (testin vm'de çalıştırıldığı yer)
  • Güvenlik amacıyla vm'de uygulama çalıştırma
  • GPU hızlandırmalı bir VM'de Linux çalıştırma

WDDM'de GPU sanallaştırması

Paravirtualizasyon (PV), temel alınan donanımlarına benzer sanal makinelere (VM) bir arabirim sağlar. PV'de, özel olarak uyarlanmamış bir konuk işletim sistemi sanal makine izleyicisinin (VMM) üzerinde çalışamayacağı için, sanal makineyi yüklemeden önce konuk işletim sistemini açıkça taşımak veya port etmek gerekir.

Avantaj -ları:

  • Donanım kaynaklarını birden çok VM paylaşır.
  • Sürücü kodunda birkaç değişiklik yapılması gerekir.

Aşağıdaki şekilde WDDM'nin sanallaştırılmış tasarımında yer alan çeşitli bileşenler gösterilmektedir.

Paravirtualize edilmiş tasarımda yer alan bileşenleri gösteren diyagram.

Konuk VM'deki D3D çalışma zamanları değiştirilmez. Kullanıcı modu çalışma zamanı ve KMT çekirdek thunks ile arabirimler aynı kalır.

Sürücü bileşenleri çok fazla değişiklik gerektirmez:

  • Konuk VM'deki UMD'nin aşağıdakileri yapması gerekir:

    • Konak çekirdek modu sürücüsü (KMD) ile iletişimin VM sınırında gerçekleştiğini unutmayın.
    • Kayıt defteri ayarlarına erişmek için eklenen Dxgkrnl hizmetlerini kullanın.
  • Konukta KMD yok, yalnızca UMD var. Sanal İşleme Cihazı (VRD) KMD, KMD'nin yerini alır. VRD'nin amacı Dxgkrnlyüklenmesini kolaylaştırmaktır.

  • Konukta video bellek yöneticisi (VidMm) veya zamanlayıcı (VidSch) yoktur.

  • BIR VM'deki Dxgkrnl, "thunk" çağrılarını alır ve bunları VM veri yolu kanalları üzerinden ana bilgisayar bölmesine iletir. Misafirdeki Dxgkrnl, ayırmalar, işlemler, cihazlar ve diğer kaynaklar için yerel nesneler oluşturur ve bu da ev sahibi ile olan trafiği azaltır.

Sanal işleme cihazı (VRD)

Sanal makinede paravirtualize edilmiş bir GPU olmadığında, SM'nin Cihaz Yöneticisi "Microsoft Hyper-V Video" bağdaştırıcısını gösterir. Varsayılan olarak, yalnızca görüntüleme için kullanılan bu bağdaştırıcı, işleme amacıyla BasicRender bağdaştırıcısıyla eşleştirilir.

Sanal makineye para-sanal GPU eklediğinizde, VM'nin Cihaz Yöneticisi iki bağdaştırıcı gösterir:

  • Microsoft Hyper-V Video Bağdaştırıcısı veya Microsoft Uzaktan Görüntü Bağdaştırıcısı
  • Microsoft Sanal Görüntü Sürücüsü (Gerçek ad, ana bilgisayar üzerindeki GPU adaptörünün adıdır)

Varsayılan olarak, VRD Hyper-V Video bağdaştırıcısı ile eşleştirilir, bu nedenle tüm ui işleme VRD bağdaştırıcısı ile gerçekleşir.

İşleme sorunlarıyla karşılaşırsanız, GpuVirtualizationFlags kayıt defteri ayarını kullanarak bu eşleştirmeyi devre dışı bırakabilirsiniz. Bu durumda, bir uygulama özellikle onu seçtiğinde sadece render için kullanılan bağdaştırıcı (VRD) kullanılır. Örneğin, bazı DirectX örnekleri işleme cihazını değiştirmenize olanak sağlar. Direct3D çalışma zamanları, bir uygulama bunu kullanmaya karar verince VRD'ye mantıksal bir görüntü çıkışı ekler.

VM'ye birden çok sanal GPU eklediğinizde, misafir işletim sisteminde birden çok VRD bağdaştırıcısı olabilir. Ancak, bunlardan yalnızca biri Hyper-V Video bağdaştırıcısıyla eşleştirilebilir. Hangisini belirtmenin bir yolu yoktur; işletim sistemi seçer.

Kapsayıcılar ve VM'ler

GPU sanallaştırma, VM'ler ve kapsayıcılar için desteklenir. Kapsayıcılar, konak işletim sistemi ikili dosyalarının kapsayıcı VM'sine eşlendiği basit VM'lerdir.

Kapsayıcılar hakkında daha fazla bilgi için bkz. Windows ve kapsayıcılar.

VM'lerin güvenliğini sağlama

Güvenli bir VM için aşağıdaki sınırlamalar vardır:

  • DriverKnownEscape bayrağıyla kullanılan bilinen kaçışlar dışında sürücü kaçış çağrılarına izin verilmez.
  • IoMmu yalıtımı etkinleştirildi. Sürücü IoMmu yalıtımını desteklemiyorsa VM oluşturma işlemi başarısız olur.

Güvenli mod etkinleştirildiğinde:

Geliştirme sırasında güvenli modu zorlamak veya IoMmu yalıtımını devre dışı bırakmak için kayıt defteri ayarları vardır. Daha fazla bilgi için bkz. kayıt defteri ayarları.

VM/kapsayıcı masaüstü uzak erişimi

İki yöntem kullanarak sanal makinedeki (VM) bir masaüstünün içeriğini konağa uzaktan ekleyebilirsiniz:

  • Hyper-V görüntü bağdaştırıcısı
  • Terminal oturumu uzaktan erişim

VM'ye bağlanmak için RDP (uzak masaüstü) kullanıldığında, terminal oturumu uzaktan yönetim için kullanılır.

Hyper-V yöneticisi vm masaüstü görüntülemek için VMConnect uygulamasını kullanır. VMConnect iki modda çalışır:

  • Terminal oturumu uzaktan erişimi kullanan gelişmiş mod.
  • Hyper-V görüntü bağdaştırıcısını kullanan temel mod.

VM çalışan işlemi ve VM belleği

Bir VM veya kapsayıcı başlattığınızda, işletim sistemi konakta aşağıdaki işlemleri oluşturur:

  • VM çalışan işlemi (vmwp.exe)
  • VM bellek işlemi (vmmem.exe)

Vmwp, sanallaştırılmış grafik bağdaştırıcılarının sürücüsü olan vrdumed.dll (sanal işlem aygıtı kullanıcı modu öykünücü DLL'si) dahil, çeşitli sanal aygıt sürücülerini içerir.

vmmem işlem sanal adres alanı, konuktaki vGPU'nun GÇ alanı için yedekleme görevi görür. Konuk G/Ç alanına eriştiğinde, ortaya çıkan fiziksel adres, vmmem işleminin sayfa tablolarını kullanan ikinci düzey çevirinin girişidir.

Sanallaştırılmış bir ortamda, genellikle konaktaki bir kullanıcı işlemi bağlamında çalışan çeşitli KMD DDI çağrıları, bunun yerine sanal bir makine çalışırken vmmem işlemi bağlamında yürütülür.

Dxgkrnl, bu makaledeki VM çalışan işlemi olarak adlandırılan bu işlemler için tek bir DXGPROCESS (ve buna karşılık gelen KMD işlem nesnesi) oluşturur. DXG VM çalışan işlemiyle ilişkili EPROCESS, vmmem.

VM işlemleri

Konuk VM'de bir DXGPROCESS oluşturulduğunda, Dxgkrnl konakta karşılık gelen bir DXGPROCESS nesnesi oluşturur. Bu işleme, bu makaledeki VM işlemi adı verilir. DXGPROCESS ile ilişkilendirilmiş EPROCESS, vmmem .

Bir VM'den veya VM ayırma oluşturma işleminden tüm işleme işlemleri VM'nin DXGPROCESS'i bağlamında gerçekleştirilir.

Hata ayıklama amacıyla Dxgkrnl, DxgkDdiCreateProcessiçinde hangi işlemin vm çalışan işlemi veya VM işlemi olduğunu KMD'ye bildirir. Bu bilgileri kullanarak, sürücü bir VM işlemini VM çalışan işlemine bağlayabilir. Bu bilgiler, birden fazla VM'nin çalıştığı senaryolarda hata ayıklamaya yardımcı olur.

Sürücü gereksinimleri

GPU paravirtualizasyonunu destekleyen bir KMD'nin DXGK_VIDMMCAPS::ParavirtualizationSupported özelliğini ayarlaması gerekir.

Kullanıcı modu sürücüsü (UMD), özel sürücü verilerinde (işaretçiler, tanıtıcılar vb.) işlem bağlamı ile ilgili herhangi bir veri kullanmamalıdır. Bunun yerine KMD, konaktaki özel verileri farklı bir işlem bağlamında alır.

Konuktaki UMD, konaktaki KMD ile bellek paylaşamaz. Kayıt defterine erişmek için UMD Kayıt Defteri erişiminde açıklanan işlevleri kullanmalıdır.

Mevcut paravirtualizasyon uygulaması, konuk ve konak arasında iletişim kurmak için VM bus'ı kullanır. İleti boyutu üst sınırı 128 KB'tır. Şu anda Dxgkrnl mesajları parçalar halinde göndermek için bölmez. Bu nedenle, sürücünün nesne oluşturma ile geçirilen özel verilerin boyutunu sınırlaması gerekir. Örneğin, Pfnd3dddiAllocatecb birçok ayırma oluşturmak için kullanıldığında, toplam mesaj boyutu bir başlık, küresel özel veriler ve her ayırmanın özel verilerinin boyutunun ayırma sayısıyla çarpılması sonucunu içerir. Bu bilgilerin tümünün tek bir iletiye sığması gerekir.

Uygulamaları tam ekran öykünülmüş modda çalıştırma

Uzaktan iletişim için Dolaylı Görüntü bağdaştırıcısı etkinleştirilmelidir (varsayılan olarak etkindir). Devre dışı bırakmak için aşağıdaki adımları uygulayın.

  • Grup İlkesini Düzenlemeyi Başlat
  • Bilgisayar Yapılandırması->Yönetim Şablonları->Windows Bileşenleri->Uzak Masaüstü Hizmetleri->Uzak Masaüstü Oturumu Ana Bilgisayarı->Uzak Oturum Ortamı'na gidin
  • "Uzak Masaüstü Bağlantısı için WDDM grafik görüntü sürücüsünü kullan" öğesini açın
  • Devre dışı bırak'ı ve ardından Tamam'ı seçin
  • Yeniden başlat

VM'lerdeki tam ekran uygulamalar için DXGI desteği varsayılan olarak etkindir. Devre dışı bırakmak için StagingTool.exe /disable 19316777kullanın.

Tam ekran uygulamaları taklit edilmiş tam ekran modunda çalıştırılmalıdır.

Tüm DXGI uygulamaları için eFSE'yi etkinleştirin ve WDDM 2.0'a geçiş efekti geçişi için en düşük WDDM sürümünü ayarlayın:

  • D3DEnableFeature.exe /enable DXGI_eFSE_Enablement_Policy
  • D3DEnableFeature.exe /setvariant DXGI_eFSE_Enablement_Policy 7

EFSE, D3D9 uygulamaları için varsayılan olarak etkindir.

VM'de DriverStore

Konaktaki sürücü ikili dosyaları, \system32\drivers\DriverStore\FileRepository<DriverDirectory>%windir%bir sürücü deposunda bulunur.

Paravirtualizasyon için, VM'deki UMD ikili dosyalarının %windir%\system32\drivers\HostDriverStore\FileRepository<DriverDirectory>içinde olması beklenir.

Ana bilgisayar KMD, sürücü deposuna giden tam yolu içeren UMD DLL adlarını bildirir. Örneğin, c:\windows\system32\DriverStore\FileRepository\DriverSpecificDirectory\d3dumd.dll.

VM bir UMD adı istediğinde, ad <VmSystemDrive>:\windows\system32\HostDriverStore\FileRepository\DriverSpecificDirectory\d3dumd.dllolarak çevrilir.

Kapsayıcılar için Host DriverStore

Kapsayıcılar için, Hyper-V, konaktaki ana bilgisayar sürücü deposunun tam dizinini kapsayıcıda <%windir%\HostDriverStore olarak eşler.

Tam VM'ler için Host DriverStore

Sanal GPU bağdaştırıcısı VM'de başlatıldığında sürücü deposu dosyaları VM'ye kopyalanır. Bu özellik, işletim sisteminin yayımlanan sürümünde devre dışı bırakılır.

Aşağıdaki kayıt defteri anahtarı ve olası değerler kopyalama işlemini denetler. Anahtar varsayılan olarak mevcut değildir.

DWORD RTL_REGISTRY_CONTROL\GraphicsDrivers\DriverStoreCopyMode
Değer Açıklama
0 Sürücü deposunun kopyalanmasını devre dışı bırakma
1 Normal işlem (sürücü deposu dosyalarının kopyalanmasını etkinleştirin ve var olan dosyaların üzerine yazmayın).
2 Sürücü deposunun kopyalanmasını etkinleştirin ve var olan dosyaların üzerine yazabilirsiniz.

UMD'den kayıt defteri erişimi

KMD kayıt defteri anahtarları konakta bulunur ve VM'ye yansıtılamaz. Bu nedenle, UMD bu tür sürücü kayıt defteri anahtarlarını doğrudan okuyamaz. pfnQueryAdapterInfoCb2 geri çağırma, D3D çalışma zamanının D3DDDI_ADAPTERCALLBACKS yapısına eklenir. UMD, belirli kayıt defteri anahtarlarını okumak için D3DDDICB_QUERYADAPTERINFO2 ayarlarıyla pfnQueryAdapterInfoCb2 çağırabilir.

  • D3DDDICB_QUERYADAPTERINFO2::QueryTypeD3DDDI_QUERYADAPTERTYPE_QUERYREGISTRYolarak ayarlanır.
  • pPrivateDriverData, kayıt defteri bilgilerinin döndürüleceği D3DDDI_QUERYREGISTRY_INFO yapısına sahip bir arabelleğe işaret etti. UMD aşağıdaki üyeleri belirler:
  • PrivateDriverDataSize, sizeof(D3DDDI_QUERYREGISTRY_INFO)'ye ek olarak dinamik olarak boyutlandırılmış çıkış değeri için arabellek boyutudur.

UMD, D3DKMTQueryAdapterInfo'ü doğrudan da çağırabilir. Bu çağrı, konağa göre hazırlandığından ve belirli adları konuk adı alanına çevirmenin bir yolunu sağladığından konuktaki UMD için kullanışlıdır.

Belirli kayıt defteri anahtarlarını okumak için, D3DKMTQueryAdapterInfo, D3DKMT_QUERYADAPTERINFO olarak ayarlanmış biçimde çağrılır.

  • TürKMTQAITYPE_QUERYREGISTRY olarak ayarlandı
  • pPrivateDriverData bir D3DKMT_ADAPTERREGISTRYINFO yapısına işaret etti
  • PrivateDriverDataSize, sizeof(D3DKMT_ADAPTERREGISTRYINFO)'ye ek olarak dinamik olarak boyutlandırılmış çıkış değeri için arabellek boyutudur.

Örnek 1: Hizmet anahtarından değer okuma


WCHAR ValueName = L"EnableDebug";
    D3DDDI_QUERYREGISTRY_INFO Args = {};
    Args.QueryType = D3DDDI_QUERYREGISTRY_SERVICEKEY;
    Args.QueryFlags.TranslatePath = FALSE or TRUE;
    Args.ValueType = Supported registry value type;
    wcscpy_s(Args.ValueName, ARRAYSIZE(Args.ValueName), ValueName);

    D3DKMT_QUERYADAPTERINFO Args1 = {};
    Args1.hAdapter = hAdapter;
    Args1.Type = KMTQAITYPE_QUERYREGISTRY;
    Args1.pPrivateDriverData = &Args;
    Args1.PrivateDriverDataSize = sizeof(Args);
    NTSTATUS Status = D3DKMTQueryAdapterInfo(&Args1);
    if (NT_SUCCESS(Status) &&
        Args.Status == D3DDDI_QUERYREGISTRY_STATUS_SUCCESS)
    {
       if (ValueType == REG_SZ || ValueType == REG_EXPAND_SZ) {

wprintf(L"Value: \"%s\"\n", Args.OutputString);
       } else
       if (ValueType == REG_MULTI_SZ) {
          wprintf(L"Value: ");
          for (UINT i = 0; i < Args.OutputValueSize; i++) {
             if (Args.OutputString[i] == 0) {
                wprintf(L" ");
             } else {
                wprintf(L"%c", Args.OutputString[i]);
             }
          }
          wprintf(L"\n");
       } else
       if (ValueType == REG_DWORD) {
          wprintf(L"Value: %d\n", Args.OutputDword);
       } else
       if (ValueType == REG_QWORD) {
          wprintf(L"Value: 0x%I64x\n", Args.OutputQword);
       } else
       if (ValueType == REG_BINARY) {
          wprintf(L"Num bytes: %d\n", Args.OutputValueSize);

for (UINT i = 0; i < Args.OutputValueSize; i++) {
             wprintf(L"%d ", Args.OutputBinary[i]);
          }
          wprintf(L"\n");
       }
    }

Örnek 2: Sürücü deposunun yolunu okuma

    D3DDDI_QUERYREGISTRY_INFO Args = {};
    Args.QueryType = D3DDDI_QUERYREGISTRY_DRIVERSTOREPATH;

    D3DKMT_QUERYADAPTERINFO Args1 = {};
    Args1.hAdapter = hAdapter;
    Args1.Type = KMTQAITYPE_QUERYREGISTRY;
    Args1.pPrivateDriverData = &Args;
    Args1.PrivateDriverDataSize = sizeof(Args);
    NTSTATUS Status = D3DKMTQueryAdapterInfo(&Args1);
    if (NT_SUCCESS(Status) &&
        Args.Status == D3DDDI_QUERYREGISTRY_STATUS_SUCCESS)
    {
        Args.OutputString holds the output NULL terminated string.
        Args.OutputValueSize holds the number of characters in the string
    }

%windir%dosyaları VM'deki \system32 ve %windir%\syswow64 dizinlerine kopyalamak

Bazı durumlarda, sürücü kullanıcı modu DLL'lerinin \system32 %windir%ve \syswow64 dizinlerinde%windir%olması gerekir.

İşletim sistemi, sürücüye dosyaların konaktaki sürücü deposundan %windir%\system32 veya konuktaki %windir%\syswow64'ye kopyalanmasını belirtmesi için bir yol sağlar.

Yükleme INF'sinde, sürücü grafik bağdaştırıcısı kayıt defteri anahtarında aşağıdaki alt anahtarlarda birden çok değer tanımlayabilir:

  1. CopyToVmOverwrite
  2. CopyToVmWhenNewer
  3. CopyToVmOverwriteWow64
  4. CopyToVmWhenNewerWow64

CopyToVmOverwrite ve CopyToVmWhenNewer alt anahtarları, dosyaları %windir%\system32 dizinine kopyalamak için kullanılır.

CopyToVmOverwriteWow64 ve CopyToVmWhenNewerWow64 alt anahtarları, dosyaları %windir%\syswow64 dizinine kopyalamak için kullanılır.

CopyToVmOverwrite ve CopyToVmOverwriteWow64 altındaki dosyalar, hedefteki dosyaların her zaman üzerine yazar.

CopyToVmWhenNewer ve CopyToVmWhenNewerWow64 altındaki dosyalar, yalnızca dosya değiştirme tarihi daha yeniyse, hedefteki dosyaların üzerine yazılır. "Daha yeni" ölçütler iki bilgi parçasını karşılaştırır:

  • Dosya Sürümü
  • SonYazmaZamanı

Hedef dosya .dll veya .exe soneki ile sona erdiğinde, en büyük sürümün "daha yeni" olarak kabul edildiği en önemli karşılaştırma değeri olarak FileVersion kullanılır. Hedef dosya .dll veya .exe soneki ile bitmediğinde veya iki FileVersion eşitse, lastWriteTime, sonraki tarih/saatin "daha yeni" olarak kabul edildiği en az önemli karşılaştırma değerleri olarak kullanılır.

Alt anahtar altındaki her değer türü REG_MULTI_SZ veya REG_SZ olmalıdır. Değer türü REG_MULTI_SZ ise, değerde en fazla iki dize olmalıdır. Bu gereksinim, her değerin tek bir dizeyi veya ikinci dizenin boş olabileceği dize çiftini tanımladığı anlamına gelir.

Çiftteki ilk ad, sürücü deposundaki bir dosyanın yoludur. Yol, sürücü deposunun kökenine göredir ve alt dizinler içerebilir.

Çiftteki ikinci ad, %windir%\system32 veya %windir%\syswow64 dizininde görünmesi gereken dosyanın adıdır. İkinci isim yalnızca dosya adı olmalı, yolu içermemelidir. İkinci ad boşsa, dosya adı sürücü deposundakiyle aynıdır (alt dizinler hariç).

Bu yaklaşım, sürücünün ana sürücü mağazasında ve misafir sistemde farklı adlara sahip olmasını sağlar.

Örnek 1

Aşağıdaki örnekte, <DriverStorePath>\CopyToVm\softgpu1.dll%windir%\system32\softgpu2.dll'e kopyalamak için işletim sisteminin nasıl kullanılacağı gösterilmektedir.

INF [DDInstall] section
HKR,"softgpukmd\CopyToVmOverwrite",SoftGpuFiles,%REG_MULTI_SZ%,"CopyToVm\softgpu1.dll”, “softgpu2.dll”
The directive creates the registry key in the software (adapter) key:
"HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\<number>\CopyToVmOverwrite”, SoftGpuFiles = REG_MULTI_SZ, “CopyToVm\softgpu1.dll”, “softgpu2.dll"

Örnek 2

Aşağıdaki örnek, işletim sisteminin <DriverStorePath>\softgpu1.dll%windir%\system32\softgpu.dll'e ve <DriverStorePath>\softgpu2.dll'yi %windir%\system32\softgpu2.dll'e nasıl kopyalayacağını göstermektedir.

INF [DDInstall] section:
HKR,"CopyToVmOverwrite",SoftGpuFiles1,%REG_MULTI_SZ%,"softgpu1.dll”,”softgpu.dll"
HKR,"CopyToVmOverwrite",SoftGpuFiles2,%REG_SZ%, “softgpu2.dll"
The directive creates the registry key in the software (adapter) key:
“HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\<number>\CopyToVmOverwrite”,  SoftGpuFiles1 = REG_MULTI_SZ, “softgpu1.dll”, “softgpu.dll"

“HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\<number>\CopyToVmOverwrite”,  SoftGpuFiles2 = REG_SZ, “softgpu2.dll””

Örnek 3

Aşağıdaki örnek, işletim sisteminin <DriverStorePath>\Subdir1\Subdir2\softgpu2wow64.dll%windir%\syswow64\softgpu.dll'e ve <DriverStorePath>\softgpu.dll'yi %windir%\syswow64\softgpu2wow64.dll'e nasıl kopyalayacağını göstermektedir.

INF [DDInstall] section:
HKR,"CopyToVmOverwriteWow64",SoftGpuFiles,%REG_MULTI_SZ%,“Subdir1\Subdir2\softgpu2wow64.dll”,”softgpu.dll”.
The directive creates the registry key in the software (adapter) key:
“HKLM\SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\<number>\CopyToVmOverwriteWow64”,  SoftGpuFiles = REG_MULTI_SZ, “Subdir1\Subdir2\softgpu2wow64.dll”,”softgpu.dll

DxgkDdiCreateProcess değişiklikleri

KMD'nin DxgkDdiCreateProcess işlevinin VM çalışan işlemlerini ve VM işlemlerini destekleyecek şekilde güncelleştirilmesi gerekir. aşağıdaki alanlar DXGKARG_CREATEPROCESS yapısına eklenir:

  • hKmdVmWorkerProcess
  • ProcessNameLength
  • pProcessName

VM çalışan işlemlerini ve VM işlemlerini desteklemek için aşağıdaki bayraklar DXGK_CREATEPROCESSFLAGS'e eklenir:

  • VirtualMachineProcess
  • VirtualMachineWorkerProcess

DxgkDdiSetVirtualMachineData

DxgkDdiSetVirtualMachineData, Dxgkrnl için bir sanal makine hakkındaki bilgileri KMD'ye geçirmek üzere eklenir.

Konağa zaman uyumsuz VM veri yolu iletileri

Konuk işletim sistemindeki Dxgkrnl'den konağa gönderilen bazı iletiler eşzamansızdır. Yüksek frekanslı Dxgkrnl API çağrılarının konuk sistemdeki performansını bu yaklaşım artırır. Eşzamanlı her bir VM veri yolu mesajının sunucuya olan yükü yüksek olabilir.

Eş zamansız iletiler şunlardır:

GPU-PV'de LDA desteği

Bağlı görüntü bağdaştırıcısı (LDA), GPU-PV'de desteklenir. Tutarlı bir uygulamayı sağlamak ve LDA desteğinin gelecekte eski Windows sürümlerine geri aktarımını desteklemek için, KMD'nin,DxgkCbIsFeatureEnabled(DXGK_FEATURE_LDA_GPUPV) çağrısı yaparak GPU-PV'da LDA desteğini denetlemesi gerekir. İşlev başarılı olursa ve Etkindöndürürse destek etkinleştirilir. KMD bu geri çağırmayı çağırmazsa Dxgkrnl KMD'nin GPU-PV'de LDA'yı desteklemediğini varsayar.

İşletim sistemi özelliği destekliyorsa, LDA'yı kullanıcı modunda etkinleştirmek sürücüye aittir. Sürücü LDA'yı kullanıcı modunda etkinleştirirse, bunu aşağıdaki gibi yapmalıdır.

Çalışma zamanı LDA durumu
D3D12 öncesi çalışma zamanı DXGK_FEATURE_LDA_GPUPV destekleniyorsa ve konuk işletim sistemi Windows 11, sürüm 22H2 (WDDM 3.1) veya üzeriyse etkinleştirin.
DX dışı çalışma zamanları (Windows) DXGK_FEATURE_LDA_GPUPV destekleniyorsa ve konuk işletim sistemi Windows 11, sürüm 22H2 (WDDM 3.1) veya üzeriyse etkinleştirin. UMD, işletim sistemi sürümünü denetlemek yerine D3DKMTQueryAdapterInfo(KMTQAITYPE_PHYSICALADAPTERCOUNT) çağrısı yapabilir ve 1'den büyük fiziksel bağdaştırıcı sayısı döndürdüğünde LDA'yı etkinleştirebilir.
D3D12 çalışma zamanı (Windows) Etkinleştir. Bkz. D3D12 çalışma zamanıiçin LDA durumunu ayarlama.
Linux (d3d12 ve DX içermeyen çalışma zamanı) DXGK_FEATURE_LDA_GPUPV destekleniyorsa etkinleştirin.

DXGKDDI_INTERFACE_VERSION_WDDM3_0'den daha küçük bir arabirim sürümüyle derlenen sürücüler, DXGK_FEATURE_LDA_GPUPVkontrol etmez. Bu sürücüler Linux çalışma zamanları için LDA'yı etkinleştirmeye devam edebilir.

D3D12 çalışma zamanı için LDA durumunu ayarlama

D3D12 çalışma zamanı için LDA'yı etkinleştirirken veya devre dışı bırakırken, UMD'nin çalışma zamanına doğru katman ve düğüm eşleme bilgilerini döndürmesi gerekir. Kod akışı aşağıdaki gibidir:

  • D3D12, UMD'den D3D12_CROSS_NODE_SHARING_TIER kapasitesini alır.

  • D3D12, D3DKMTQueryAdapterInfo(KMTQAITYPE_PHYSICALADAPTERCOUNT)çağırarak Dxgkrnl fiziksel bağdaştırıcı sayısını alır.

  • D3D12, mantıksal düğüm dizinlerinin fiziksel düğümlere eşlemesini almak için pfnQueryNodeMap(PhysicalAdapterCount, &harita) çağırır. Bu durumda düğüm, fiziksel bağdaştırıcı anlamına gelir. UMD'nin, düğümü devre dışı bırakmak için, eşlemde veya D3D12DDI_NODE_MAP_HIDE_NODE'de gerçek fiziksel bağdaştırıcı dizinini ayarlaması gerekir.

  • pfnQueryNodeMap sonuçlarına bağlı olarak, D3D12 gizli düğümleri saymayarak etkili fiziksel bağdaştırıcı sayısını hesaplar.

  • Katman durumu ile geçerli fiziksel bağdaştırıcı sayısı uyuşmuyorsa, D3D12 cihaz oluşturmakta başarısız olur. Uyuşmazlık şu durumlarda gerçekleşir:

    • Katman D3D12DDI_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED ve bağdaştırıcı sayısı 1'den fazladır.
    • Katman D3D12DDI_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED değil ve bağdaştırıcı sayısı 1'dir.

LDA'yı devre dışı bırakmak için UMD'nin D3D12DDI_CROSS_NODE_SHARING_TIER_NOT_SUPPORTED katmanını döndürmesi ve düğüm eşlemesinde yalnızca bir fiziksel bağdaştırıcıyı etkin tutması gerekir.

D3DKMTQueryAdapterInfo(KMTQAITYPE_PHYSICALADAPTERCOUNT)

Fiziksel bağdaştırıcı sayısı için KMTQAITYPE_PHYSICALADAPTERCOUNT sorgusu, her zaman doğru fiziksel bağdaştırıcı sayısını konuğa döndürür.

  • Windows 11'den önceki sürüm 22H2 misafirlerinde 1 döndürür. Bu değer, konuk kodunda sabit kodlanmıştır. LDA desteği eski işletim sistemi sürümlerine taşınabilirse gelecekte değişebilir.
  • Windows 11, sürüm 22H2 ve üzeri sistemlerde şunları döndürür:

Paravirtualizasyon ortaya çıkar

BIOS'ta sanallaştırma desteğini etkinleştirin (VT-d veya benzeri). GPU-PV kurulumu VMMS sanal makineleri ve kapsayıcılar için farklıdır.

PowerShell'de (Yönetici olarak çalışıyor) sunucuda betik yürütmeyi etkinleştirin:

set-executionpolicy unrestricted

VMMS sanal makine kurulumu

Konağı ve VM'yi ayarlama

VM'deki işletim sistemi derlemesi, konaktaki işletim sistemi derlemesinden daha eski veya daha yeni olabilir.

  1. sunucu rollerinde Hyper-V özelliğini veya istemcideki Hyper-V özelliğini etkinleştirin. Bu özelliği sunucuda etkinleştirirken, Dış anahtar olarak ağ bağdaştırıcısını kullanma seçeneğini belirleyin.

  2. (isteğe bağlı) Test imzalamayı etkinleştir (bcdedit -set TESTSIGNING ON)

  3. Yeniden başlat.

  4. Yarı sanallaştırmayı destekleyen bir GPU sürücüsü yükleyin.

  5. (isteğe bağlı) Bazı sürücüler ParavirtualizationSupported üst sınırını ayarlamaz. Bu durumda, sürücüyü yüklemeden önce aşağıdaki kayıt defterini ekleyin veya bayrak ayarlandıktan sonra cihazı devre dışı bırakın/etkinleştirin.

    DWORD HKLM\System\CurrentControlSet\Control\GraphicsDrivers\GpuVirtualizationFlags = 1   
    
  6. İşletim sisteminin sanallaştırılmış GPU'yı tanıyıp tanımadığını denetlemek için aşağıdaki PowerShell komutunu çalıştırın:

    Get-VMPartitionableGpu
    
    # Example output from running the command
    Name                    : \\?\PCI#VEN_10DE&DEV_1C02&SUBSYS_11C210DE&REV_A1#4&275d7527&0&0010#{064092b3-625e-43bf-9eb5-d
                              c845897dd59}\GPUPARAV
    ValidPartitionCounts    : {32}
    PartitionCount          : 32
    TotalVRAM               : 1,000,000,000
    AvailableVRAM           : 1,000,000,000
    MinPartitionVRAM        : 0
    MaxPartitionVRAM        : 1,000,000,000
    OptimalPartitionVRAM    : 1,000,000,000
    TotalEncode             : 18,446,744,073,709,551,615
    AvailableEncode         : 18,446,744,073,709,551,615
    MinPartitionEncode      : 0
    MaxPartitionEncode      : 18,446,744,073,709,551,615
    
    OptimalPartitionEncode  : 18446744073709551615
    TotalDecode             : 1000000000
    AvailableDecode         : 1000000000
    MinPartitionDecode      : 0
    MaxPartitionDecode      : 1000000000
    OptimalPartitionDecode  : 1000000000
    TotalCompute            : 1000000000
    AvailableCompute        : 1000000000
    MinPartitionCompute     : 0
    MaxPartitionCompute     : 1000000000
    OptimalPartitionCompute : 1000000000
    CimSession              : CimSession: .
    ComputerName            : MYCOMPUTER-TEST2
    IsDeleted               : False
    
  7. GPU ile vm oluşturmak için PowerShell'de aşağıdaki komutları çalıştırın. TEST adlı bir VM oluşturulur.

    $vm = “TEST“
    New-VM -VMName $vm -Generation 2
    Set-VM -GuestControlledCacheTypes $true -VMName $vm
    
  8. VM için I/O alanını ayarlayın. GPU-PV, CPU tarafından görülebilir ayırmaları işlemek için GÇ alanı kullanır. En az 8 GB GÇ alanı gerekir.

    Set-VM -LowMemoryMappedIoSpace 1GB -VMName $vm
    Set-VM -HighMemoryMappedIoSpace 16GB -VMName $vm
    
  9. [isteğe bağlı] Varsayılan olarak, yüksek bellekli GÇ alanının temel adresi (64 GB - 512 MB) olarak ayarlanır. 36 bit fiziksel bellek adreslemeli Haswell yonga kümelerinde GÇ alanı bölgesinin bitiş adresi 64 GB'ın altında olmalıdır, bu nedenle başlangıç adresinin buna göre ayarlanması gerekir. SetHighMmioBase.ps1adlı aşağıdaki betik, aşağıdaki parametrelerle çalıştırıldığında başlangıç adresini 47 GB olarak ayarlar:

    SetHightMmioBase.ps1 “TEST” 48128
    
    # SetHighMmioBase.ps1
    
    param( [string]$VmName, $BaseInMB)
    
    function Get-WMIVM
    {
        [CmdletBinding()]
        param(
            [parameter(Mandatory=$true)]
            [ValidateNotNullOrEmpty()]
            [string]$VmName = ""
            )
    
        gwmi -namespace root\virtualization\v2 -query "select * from Msvm_ComputerSystem where ElementName = '$VmName'"
    }
    function Get-WMIVmSettingData
    {
        [CmdletBinding()]
        param(
            [parameter(Mandatory=$true)]
            [ValidateNotNullOrEmpty()]
            [string]$VmName = ""
            )
        $vm = Get-WMIVM $VmName
    
        return $vm.GetRelated ("Msvm_VirtualSystemSettingData","Msvm_SettingsDefineState",$null,$null, "SettingData", "ManagedElement", $false, $null)
    }
    
    Write-Host "Setting HighMmioGapBase to $BaseInMB for VmName $VmName"
    $vssd = Get-WMIVmSettingData $VmName
    $vmms = Get-WmiObject -Namespace "root\virtualization\v2" -Class Msvm_VirtualSystemManagementService
    $vssd.HighMmioGapBase = $BaseInMB
    $settingsText = $vssd.PSBase.GetText("CimDtd20")
    $ret=$vmms.ModifySystemSettings($settingsText).ReturnValue
    if ($ret -eq 0)
    {
       Write-Host "Successfully set" $vssd.HighMmioGapBase
    } else
    {
       Write-Host "Error $ret"
    }
    
  10. VM'ye bir sanal GPU ekleyin ve denetim noktalarını devre dışı bırakın.

    Add-VMGpuPartitionAdapter -VMName $vm
    Set-VM -CheckpointType Disabled -VMName $vm
    
  11. VM'de paravirtualize edilmiş bir GPU olduğunu kontrol etmek için aşağıdaki komutu çalıştırın:

    Get-VMGpuPartitionAdapter -VMName $vm in PowerShell. The output should show the adapter.
    
    
    # Example output from running the command
    
    MinPartitionVRAM        :
    MaxPartitionVRAM        :
    OptimalPartitionVRAM    :
    MinPartitionEncode      :
    MaxPartitionEncode      :
    OptimalPartitionEncode  :
    MinPartitionDecode      :
    MaxPartitionDecode      :
    OptimalPartitionDecode  :
    MinPartitionCompute     :
    MaxPartitionCompute     :
    OptimalPartitionCompute :
    Name                    : GPU Partition Settings
    Id                      : Microsoft:9ABB95E2-D12D-43C3-B840-6F4A9CFB217B\929890BC-BB33-4687-BC1A-F72A4F1B3B3F
    VMId                    : 9abb95e2-d12d-43c3-b840-6f4a9cfb217b
    VMName                  : TEST
    VMSnapshotId            : 00000000-0000-0000-0000-000000000000
    VMSnapshotName          :
    
    CimSession              : CimSession: .
    ComputerName            : MYCOMPUTER-TEST2
    IsDeleted               : False
    VMCheckpointId          : 00000000-0000-0000-0000-000000000000
    VMCheckpointName        :
    
  12. VM'de kullandığınız istemci derlemesinin VHDX'ini bir konak dizinine kopyalayın. Örneğin, d:\VM\os.vhdx.

  13. Hyper-V yöneticisini açın ve VM parametrelerini değiştirin (VM'yi seçin ve Ayarlar'ı seçin):

    • Güvenlik - Güvenli Önyükleme etkinleştirişaretini kaldırın.
    • Bellek - DenetleDinamik Belleği Etkinleştir. Bellek miktarını 1.024 MB veya daha fazla olarak ayarlayın.
    • İşlemci - sanal işlemci sayısını 2 veya 4 olarak ayarlayın.
    • Ağ bağdaştırıcısı - Açılan kutudan VM ile kullanılacak ağ bağdaştırıcısını seçin. Ağ hata ayıklama etkinleştirildiyse Microsoft Hata Ayıklama NET bağdaştırıcısı'nı seçmeyi unutmayın.
    • SCSI denetleyicisi - Sabit Sürücü - Ekle - Sanal Sabit Disk - Gözat - d:\VM\os.vhdx seç
  14. Bağdaştırıcı konukta başlatıldığında işletim sistemi, konak sürücü deposundaki dosyaları konuktaki HostDriverStore dizinine kopyalar.

    • VM'nin VHDX'ini bağlayın. Örneğin, f: diskine.
    • Bağlı VM'de f:\%windir%\system32\HostDriverStore\FileRepositoryadlı bir dizin oluşturun.
    • Sürücü dosyalarını konaktaki %windir%\system32\DriverStore'ten VM'ye kopyalayın. VM'de f:\%windir%\system32\HostDriverStore\FileRepository\YourDriverDirectory\* olmalıdır.
  15. Sürücünün %windir%\system32 veya %windir%\syswow64dosyalarına erişmesi gerekiyorsa, dosyaları el ile VM'ye kopyalayın.

  16. Sürücüler Microsoft tarafından imzalanmamışsa VM'de test oturum açmayı etkinleştirin. CMD yönetici penceresinde aşağıdaki komutu çalıştırın:

    bcdedit /store <VM drive>:\EFI\Microsoft\Boot\BCD -set {bootmgr} testsigning on
    

    VM'nin VHDX'ini çıkarın.

  17. VM'yi başlatın.

  18. Hyper-V yöneticisi Bağlan seçeneğini kullanarak VM'ye bağlanın.

VM'NİN İÇİNDE

VM'nin cihaz yöneticisinde bir Sanal İşleme Cihazı olup olmadığını denetleyin. VM içindeki tüm işlemeler sanal GPU'ya gider.

VM ayarlamak için PowerShell betiği

Aşağıdaki PowerShell betiği, sıfırdan VM'nin nasıl ayarlandığını gösteren bir örnektir. Gereksinimlerinize uyacak şekilde değiştirin.


Param(
   [string]$VMName,
   [string]$VHDPath,
   [string]$SwitchName,
   [switch]$CreateVm,
   [switch]$InitDebug,
   [switch]$CopyRegistry,
   [switch]$CopyDriverStore,
   [switch]$CreateSwitch,
   [switch]$AddGpu,
   [switch]$All
)

if($All)
{
   $CreateVm = $True
   $CreateInitDebug = $True
   $CopyRegistry = $True
   $CopyDriverStore = $True
   $CreateSwitch = $True
   $AddGpu = $True
   $InitDebug = $True
}

   $vm = $VMName

#
# Validate parameters
#
if ($CreateSwitch -or $CreateVM)
{
    if ($SwitchName -eq "")
    {
        write "SwitchName is not set"
        exit
    }
}

if ($AddGpu -or $CreateVM)
{
    if ($VMName -eq "")
    {
        write "VMName is not set"
        exit
    }
}

if ($InitDebug -or $CreateVM -or $CopyDriverStore -or $CopyRegistry)
{
    if ($VHDPath -eq "")
    {
        write "VHDPath is not set"
        exit
    }
}

enable-windowsoptionalfeature -FeatureName Microsoft-Hyper-V-All -online

#
# Create a network switch for the VM
#
if ($CreateSwitch)
{
    New-VMSwitch $SwitchName -NetAdapterName "Ethernet (Kernel Debugger)"
}

#
# Create a VM and assign VHD to it
#
if ($CreateVm)
{
   New-VM -VMName $vm -Generation 2
   Set-VM -GuestControlledCacheTypes $true -VMName $vm


Set-VM -LowMemoryMappedIoSpace 1Gb -VMName $vm
   Set-VM -HighMemoryMappedIoSpace 32GB -VMName $vm
   Set-VMProcessor -VMname $vm -count 4
   Set-VMMemory -VMName $vm -DynamicMemoryEnabled $true -MinimumBytes 1024MB -MaximumBytes 4096MB -StartupBytes 1024MB -Buffer 20
   Add-VMHardDiskDrive -VMName $vm -Path $VHDPath
   Connect-VMNetworkAdapter -VMName $vm -Name "Network Adapter" -SwitchName $SwitchName
   Set-VMFirmware -VMName $vm -EnableSecureBoot off
   Set-VMFirmware -VMName $vm -FirstBootDevice (Get-VMHardDiskDrive -VMName $vm)
}

#
# Enable debugger and testsiging
#
if ($InitDebug)

```powershell
{
   Mount-vhd $VHDPath
   Add-PartitionAccessPath  -DiskNumber (Get-DiskImage -ImagePath $VHDPath | Get-Disk).Number -PartitionNumber 1 -AssignDriveLetter
   $efidrive = (Get-DiskImage -ImagePath $VHDPath | Get-Disk | Get-Partition -PartitionNumber 1).DriveLetter
   bcdedit /store ${efidrive}:\EFI\Microsoft\Boot\BCD -set '{bootmgr}' testsigning on
   bcdedit /store ${efidrive}:\EFI\Microsoft\Boot\BCD -set '{default}' debug on
   bcdedit /store ${efidrive}:\EFI\Microsoft\Boot\BCD /dbgsettings net port:50052 key:a.b.c.d hostip:10.131.18.133
   Dismount-VHD $VHDPath
}

#

# Now boot the VM without vGPU to verify that it's initialized correctly
# If everything is OK, turn off the VM
#
if ($CreateVm)
{
   Write-Output "Boot the VM and turn it OFF after it's initialized"
   pause
}

#
# Add virtual GPU
#
if($AddGpu)
{
   Add-VMGpuPartitionAdapter -VMName $vm
   Get-VMGpuPartitionAdapter -VMName $vm
}

#
# Copy the driver store to the VM
#
if ($CopyDriverStore)
{
   Write "Copying driver store"
   Mount-vhd $VHDPath
   $drive = (Get-DiskImage -ImagePath $VHDPath | Get-Disk | Get-Partition -PartitionNumber 3).DriveLetter
   xcopy /s $Env:windir\system32\driverstore\* ${drive}:\windows\system32\hostdriverstore\


Dismount-VHD $VHDPath
}

#
# Export driver registry settings
#
if ($CopyRegistry)
{
   Write "Copying registry"
   Mount-vhd $VHDPath
   $drive = (Get-DiskImage -ImagePath $VHDPath | Get-Disk | Get-Partition -PartitionNumber 3).DriveLetter
   reg load HKLM\VMSettings ${drive}:\Windows\System32\config\SYSTEM
   reg copy "HKLM\System\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000" "HKLM\VmSettings\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000" /s /f
   reg unload "HKLM\VmSettings"
   Dismount-VHD $VHDPath
}

VM'de hata ayıklama

VM hata ayıklayıcısını normal bir istemci makinesinde ağ hata ayıklaması ile aynı şekilde yapılandırın.

VM başlatılmazsa veya siyah ekran görürseniz:

  • Aşağıdaki komutları kullanarak VM'yi kapatın ve sanal GPU'dan kaldırın:

    $vm = “TEST“
    remove-VMGpuPartitionAdapter  -VMName $vm -AdapterId “<Id from Get-VMGpuPartitionAdapter>”
    

    Örneğin:

    remove-VMGpuPartitionAdapter  -VMName $vm -AdapterId “Microsoft:9ABB95E2-D12D-43C3-B840-6F4A9CFB217B\929890BC-BB33-4687-BC1A-F72A4F1B3B3F”
    
  • VM'yi başlatın. Başarıyla başlatılırsa, sürücü dosyalarının VM'deki HostDriverStore'na doğru şekilde kopyalandığından emin olun.

  • Add-VMGpuPartitionAdapter komutunu kullanarak vm'ye vGPU ekleyin.

  • VM'yi yeniden başlatın.

Ek bilgi için bkz. Sorun Giderme.

Kapsayıcı kurulumu

Kapsayıcılar (Konak İşlem Sistemi (HCS) VM'leri olarak da adlandırılır) ile tam VM arasındaki fark, işletim sistemi ikili dosyalarının ve sürücü deposu dosyalarının kapsayıcıya eşlenmesidir. Bu nedenle, sürücü dosyalarını windows\system32 dizininde gerekli olmadığı sürece kapsayıcıya kopyalamanız gerekmez.

Güvenli kapsayıcılar için:

  • Sürücü kaçışları devre dışı bırakılmıştır.
  • Sürücünün, güvenli bir kapsayıcı içinde etkinleştirilmesi için IOMMU yalıtımını desteklemesi gerekir.

Ana bilgisayarda sürücüyü güncelleştirdiğinizde ve konak GPU'sunu başlattığınızda veya durdurduğunuzda, değişiklikler kapsayıcıya yansıtılır.

Windows Korumalı Alan

Bu kapsayıcı türü riskli uygulamaları denemek için kullanılır. Tam masaüstü görüntüsü ana bilgisayara uzaktan aktarılır. Dolaylı Görüntü Sürücüsü uzaktan iletişim için kullanılır. Grafik VAIL kullanılmaz, bu nedenle masaüstü görüntüsünü konağa getirmek yavaştır.

Sanal GPU, Windows Korumalı Alanı'nda varsayılan olarak devre dışıdır. Etkinleştirmek için bir WSB yapılandırma dosyası (örneğin, config.wsb ) oluşturun ve sanal GPU seçeneğini ayarlayın. Yapılandırma dosyasına tıklayarak Kum Havuzu'nu başlatın.

Yapılandırma dosyası örneği:

<Configuration>
    <VGpu>Enable</VGpu>
</Configuration>

Varsayılan olarak, kapsayıcıdaki vGPU'nun sürücü kaçışları devre dışıdır. Sürücü kaçışlarını etkinleştirmek için bir yapılandırma seçeneği vardır. Aşağıdaki WSB dosya örneği, hem Korumalı Alan'da vGPU'ya hem de sürücü kaçış işlemlerine olanak tanır.

<Configuration>
    <VGpu>EnableVendorExtensions</VGpu>
</Configuration>

Windows Sanal Alan, GPU bağdaştırıcısının "sıcak takılmasını" destekler.

Yerel Entegre Sanal Uygulama (VAIL) kapsayıcısı

Win32 uygulamalarını WCOS (Windows Core İşletim Sistemi) tabanlı bir konak içinde çalıştırmak için bu kapsayıcı türünü kullanın. Kapsayıcıdaki her uygulamanın görüntüsü, konağa uzaktan bağlanır. Grafik VAIL, her bir uygulamanın değişim zincirini uzaktan yönetmek için etkinleştirilir. Sürücü kaçışları etkinleştirilir.

Yaygın konteyner gereksinimleri

Makine gereksinimleri şunlardır:

  • Hem Vtx hem de Vtd BIOS'ta etkinleştirilmelidir (veya eşdeğerleri: AMD-V, AMD-IOMMU).
  • En az 8 GB RAM.
  • 5 GB'tan fazla sistem disk alanı.

Windows Korumalı Alanı için çekirdek hata ayıklayıcısını ayarlama

CMDIAG kullanma

Kapsayıcı Yöneticisi hizmeti (cmservice) Hyper-V yalıtılmış kapsayıcıyı denetler. CMDIAG.EXE, Hyper-V ve Kapsayıcılar özelliklerini yüklediğinizde kullanılabilen bir uygulamadır. Kapsayıcılar için çekirdek modunda hata ayıklamayı etkinleştirir, test imzalamayı etkinleştirir ve daha fazlasını sağlar.

Container Manager, Seri ve NET hata ayıklamasını destekler.

Seçenekleri görmek için cmdiag.exe Debug çalıştırın.

CMDIAG, kapsayıcı taban görüntüsündeki hata ayıklayıcı ayarlarını değiştirir. Çekirdek hata ayıklayıcısı etkinleştirildiğinde yalnızca bir kapsayıcı örneği çalıştırılmalıdır.

Hata ayıklayıcı ayarlarını değiştirmeden önce HVSICS hizmetini durdurun.


# Example 1:

C:\Windows\system32>sc stop hvsics
SERVICE_NAME: HVSICS
        TYPE               : 30  WIN32
        STATE              : 3  STOP_PENDING
                                (STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
        WIN32_EXIT_CODE    : 0  (0x0)
        SERVICE_EXIT_CODE  : 0  (0x0)
        CHECKPOINT         : 0x1
        WAIT_HINT          : 0xbb8

C:\Windows\system32>cmdiag debug -on -Serial  -Force
Debugging successfully enabled. Connection string: -k com:pipe,port=\\.\pipe\debugpipe,reconnect -v

# Example 2:

C:\Windows\system32>cmdiag debug -on -net -port 51000 -key a.b.c.d -hostip 10.131.18.34

Hata ayıklayıcıyı farklı bir makinede çalıştırma

Seri hata ayıklayıcısını kullandığınızda, farklı bir makinede çalıştırmak isteyebilirsiniz. Hata ayıklayıcıyı farklı bir makinede çalıştırmak için kdsrv.exe kullanın. Daha fazla bilgi için bkz. KD Bağlantı Sunucuları.

Çekirdek hata ayıklaması sırasında zaman aşımlarını devre dışı bırakmak için aşağıdaki kayıt defteri anahtarlarını ayarlayın:

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\UtilityVm" /v BridgeTransactionTimeout /t REG_DWORD /d 0xffffffff /f
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization\Containers\UtilityVm" /v BridgeServerConnectTimeout /t REG_DWORD /d 0xffffffff /f
reg add "HKLM\SOFTWARE\Microsoft\HVSI" /f /v DisableResetContainer /t REG_DWORD /d 1
reg add "HKLM\SOFTWARE\Microsoft\HVSI" /f /v AppLaunchTimeoutInSeconds /t REG_DWORD /d 0x7fffffff
reg add "HKLM\Software\Microsoft\Terminal Server Client" /f /v ConnectionHealthMonitoringSupported /t REG_DWORD /d 0

reg add "HKLM\Software\Microsoft\Terminal Server Client" /f /v DisableUDPTransport /t REG_DWORD /d 1
reg add "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client" /f /v ConnectionHealthMonitoringSupported /t REG_DWORD /d 0
reg add "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client" /f /v DisableUDPTransport /t REG_DWORD /d 1

VAIL kapsayıcısı için çekirdek hata ayıklayıcısını ayarlama

  • Telnet kullanarak konağa bağlanın. Konak işletim sistemindeki Ağ Ayarları'ndan konağın IP adresini alabilirsiniz.
  • Hata ayıklayıcıyı yapılandırmak için cmdiag.exe kullanın.

Hypervisor hata ayıklayıcısını yapılandırma

bcdedit /hypervisorsettings NET port:50000 key:a.b.c.d hostip:1.1.1.1
bcdedit /set {hypervisorsettings} hypervisorbusparams 0.0.0 (if needed)
bcdedit /set hypervisordebug on
reboot host

Sorun giderme

Bu bölümde GPU-PV ile ilgili sorunları giderme hakkında bilgi sağlanır.

Get-VMHostPartitionableGpu

Sanallaştırılmış bir GPU olup olmadığını görmek için Get-VMHostPartitionableGpu çağırabilirsiniz. Çıkış boşsa, bir yerlerde bir hata vardır (sürücü sanallaştırma üst sınırını ayarlamadı, sanallaştırma etkinleştirilmedi vb.).

Get-VMHostPartitionableGpu

# Example output from running the command

Name                    : \\?\PCI#VEN_10DE&DEV_1188&SUBSYS_095B10DE&REV_A1#6&cfd27c8&0&00400008#{064092b3-625e-43bf-9eb5-dc845897dd59}\PARAV
ValidPartitionCounts    : {32, 4}
PartitionCount          : 32
TotalVRAM               : 2,000,000
AvailableVRAM           : 1,800,000
MinPartitionVRAM        : 100,000
MaxPartitionVRAM        : 1,000,000
OptimalPartitionVRAM    : 1,000,000
TotalEncode             : 20
AvailableEncode         : 20
MinPartitionEncode      : 1
MaxPartitionEncode      : 5
OptimalPartitionEncode  : 4
TotalDecode             : 40
AvailableDecode         : 30
MinPartitionDecode      : 2


MaxPartitionDecode      : 20
OptimalPartitionDecode  : 15
TotalCompute            : 100
AvailableCompute        : 100
MinPartitionCompute     : 1
MaxPartitionCompute     : 50
OptimalPartitionCompute : 30
CimSession              : CimSession: .
ComputerName            : WIN-T3H0LVHJJ59
IsDeleted               : False

ETW olaylarını kullanma

Dxgkrnl ETW olayları için Yönetici ve operasyonel kanalları vardır. Olaylar Windows Olay Görüntüleyicisi: Uygulama ve Hizmetler Günlüğü - Microsoft - Windows - Dxgkrnl içinde gösterilir.

Olay Görüntüleyicisi,GPU-PV (Hyper-V-Compute, Hyper-V-Worker, Hyper-V-VID vb.) ile vm oluşturmaya katılan diğer bileşenlerden olaylar içerir.

Add-VMGpuPartitionAdapter kullanma

Add-VMGpuPartitionAdapterkullanırken, gerekli değilse bir özellik (örneğin, kod çözme) belirtmeyin. Bu özellik için 0 kullanmayın.

Remove-VMGpuPartitionAdapter kullanın

Eğer bir VM başlatılamıyorsa veya işleme sorunları yaşıyorsa, remove-VMGpuPartitionAdapterkullanarak VM'den sanal GPU'yu çıkarmayı deneyin.

remove-VMGpuPartitionAdapter  -VMName $vm -AdapterId "Microsoft:9ABB95E2-D12D-43C3-B840-6F4A9CFB217B\929890BC-BB33-4687-BC1A-F72A4F1B3B3F"

Önyükleme sırasında VM'nin başlatılmasını önleme

set-vm -AutomaticStartAction Nothing -VmName TEST

Olay görüntüleyicisi olayları

vGPU başlatmayla ilgili sorunları belirlemenize yardımcı olması için olay görüntüleyici kanalına olaylar ekleyin. Olayları "Uygulama ve Hizmet Günlükleri\Microsoft\Windows\Dxgkrnl" içinde bulabilirsiniz. Olay kanalları Yönetim ve Operasyonel'dir.

Olaylar şu durumlarda verilir:

  • vGPU oluşturuldu
  • vGPU yok edildi
  • Konuk bir sanal bağdaştırıcı açar

Olay dosyaları şu şekildedir:

  • c:\Windows\System32\winevt\Logs\Microsoft-Windows-DxgKrnl-Admin.evtx
  • c:\Windows\System32\winevt\Logs\Microsoft-Windows-DxgKrnl-Operational.evtx

Bir vGPU oluşturulup oluşturulmadığını ve herhangi bir hata olup olmadığını denetleyin.

Kayıt defteri ayarları

GpuVirtualizationFlags

GpuVirtualizationFlags kayıt defteri anahtarı, sanallaştırılmış GPU'ların davranışını ayarlamak için kullanılır. Anahtar şu konumda bulunur:

DWORD HKLM\System\CurrentControlSet\Control\GraphicsDrivers\GpuVirtualizationFlags

Aşağıdaki bitler tanımlanır:

Bit Açıklama
0x1 Tüm donanım bağdaştırıcıları için ParavirtualizationSupported sınırı uygulanır. Bu biti sunucuda kullanın.
0x2 BasicRender için ParavirtualizationSupported üst sınırını zorlar. Bu biti sunucuda kullanın.
0x4 Tüm sanal makinelerin güvenli olarak ele alınacağı güvenli sanal makine modunu zorla. Bu modda, kullanıcı modu sürücüsünde kısıtlamalar vardır. Örneğin, sürücü Escape çağrılarını kullanamaz, bu nedenle başarısız olur. Bu biti sunucuda kullanın.
0x8 Yarı sanallaştırılmış bağdaştırıcıların yalnızca görüntü bağdaştırıcısıyla eşleştirilmesini etkinleştirin. Konuk VM'de bu biti kullanın. Eşleştirme varsayılan olarak etkindir.

GuestIoSpaceSizeInMb

GuestIoSpaceSizeInMb kayıt defteri anahtarı, sanal GPU'lar için konuk GÇ alanının boyutunu megabayt olarak ayarlamak için kullanılır. Varsayılan değer 1.000 MB 'tır (1 GB). Anahtar şu konumda bulunur:

DWORD HKLM\System\CurrentControlSet\Control\GraphicsDrivers\Paravirtualization\GuestIoSpaceSizeInMb

Misafir Girdi/Çıktı alanı şu anda CPU görünür ayırmaları uygular. Ana bilgisayarda CPU görünür ayırma yedekleme deposu belleğe tutturulur ve misafir IO alanına eşlenir. Konukta, ayırma kullanıcı modu sanal adresi GÇ alanı bölgesine döndürülür. Bazı Haswell sistemlerinde CPU'nun 36 bit fiziksel adresleri vardır. Bu tür sistemlerde Hyper-V sınırlı Giriş/Çıkış (GÇ) alanı boyutuna sahiptir.

Güvenli sanal makineler için IOMMU yalıtımını devre dışı bırakma

Bir sürücü IoMmu yalıtımını desteklemiyorsa, IoMmu yalıtımını devre dışı bırakmak için geliştirme sırasında aşağıdaki kayıt defteri ayarını kullanın.

`DWORD HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\IoMmuFlags = 8`

Sanal işlevlerin sayısını sınırlama

Varsayılan olarak, GPU sanallaştırmayı destekleyen bir bağdaştırıcı tarafından kullanıma sunulan sanal işlevlerin sayısı 32'dir. Bu sayı, her VM'nin bir bağdaştırıcısı olduğu varsayılarak bağdaştırıcının 32 sanal makineye eklenebileceği anlamına gelir.

Kullanıma sunulan sanal işlevlerin sayısını sınırlamak için aşağıdaki kayıt defteri ayarını kullanabilirsiniz.

DWORD HKLM\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\NumVirtualFunctions

Örneğin, NumVirtualFunctions 1 olarak ayarlarsanız bağdaştırıcı bir kez yalnızca bir GPU'ya eklenebilir. Bu ayar, bir bilgisayarda GPU-PV destekleyen birden çok GPU bağdaştırıcısı olduğunda ve her bağdaştırıcıyı bir VM'ye atamak istediğinizde kullanışlıdır. Add-VMGpuPartitionAdapter, hangi bağdaştırıcının ekleneceğini belirtmenize izin vermez. Bu nedenle VM'ye iki bağdaştırıcı eklenirse, her ikisi de konaktan aynı GPU-PV bağdaştırıcısını alabilir.

WDDM 2.4 DDI güncelleştirmeleri

Aşağıdaki DDI güncelleştirmeleri, WDDM 2.4'te GPU sanallaştırmasını desteklemek için yapılmıştır.

DXGK_VIDMMCAPS üst sınır eklendi

ParavirtualizationSupported özelliği DXGK_VIDMMCAPS yapısına eklenir. Ana bilgisayar KMD, bu bölümde açıklanan tüm DDI'leri uygularsa bu üst sınırı belirler.

DDI aracılığıyla geçirilen sürücü özel verileri

UMD, karşılık gelen KMD'siyle özel bilgi alışverişi yapmak için çeşitli DDI'lar kullanır. KONUK VM'de UMD çalıştırıldığında, ilgili KMD DDI çağrısı konak bölümünde gerçekleşir. Bu nedenle, UMD:

  1. Özel verilerde hiçbir işaretçi iletemezsiniz.
  2. Özel verilerde hiçbir tanıtıcı geçiremez.
  3. Bu değişiklik çalışan diğer VM'leri etkileyebileceğinden KMD'ye GPU durumunda genel değişiklikler yapma talimatı vermemelidir.

DxgkDdiCreateProcess için VirtualMachineProcess bayrağı eklendi

İşletim sistemi, çalışan her sanal makine için bir sanal makine çalışan süreci oluşturur. Dxgkrnl karşılık gelen bir DXGPROCESS oluşturur ve DxgkDdiCreateProcess, VirtualMachineWorkerProcess bayrağı ayarlanmış olarak çağırır. Bu işlem bağlamında işleme veya sürücü kaynağı oluşturma işlemi yoktur. Bu nedenle, sürücü belirli kaynakları ayırmayı atlayabilir.

İşletim sistemi, GPU kullanan bir misafir VM'deki her bir işlem için ana sistemde bir DXGPROCESS oluşturur. Dxgkrnl, VirtualMachineProcess bayrağı ayarlanmış DxgkDdiCreateProcess çağırır. Her VM DXG işlemi, VM çalışan işlemiyle aynı EPROCESS'e aittir.

DxgkDdiQueryAdapterInfo güncelleştirmeleri

DXGKARG_QUERYADAPTERINFO yapısı, sanallaştırma desteği için aşağıdaki alanları içerecek şekilde güncelleştirilir:

  • Bayrakları üyesi eklenir ve bu da Dxgkrnl aşağıdakileri belirtmesine olanak tanır:

    • VirtualMachineData'i, çağrının bir VM'den geldiğini göstermek için ayarlar.
    • Vm'nin güvenli modda çalıştığını göstermek için SecureVirtualMachine ayarlar.
  • hKmdProcessHandle eklenir ve bu da bir konuk VM'den kaynaklanan sorgularla ilgilenirken sürücünün konak tarafında doğru işlem bağlamını tanımlamasına ve kullanmasına olanak tanır.

DxgkDdiEscape güncelleştirmeleri

hKmdProcessHandle üyesi, bir konuk VM'den kaynaklanan çıkışlarla ilgilenirken sürücünün konak tarafında doğru işlem bağlamını tanımlamasına ve kullanmasına izin vermek için DXGKARG_ESCAPE yapısına eklenir.

sanal makineden DxgkDdiEscape çağrıldığını belirtmek için D3DDDI_ESCAPEFLAGS yapısına VirtualMachineData bayrağı eklenir.

GPU ayırmalarına fiziksel erişim

Şu anda sürücü ayırmalara fiziksel erişim uygulamaz. Sürücü GpuMmu'i desteklemelidir.

WDDM 2.5 DDI güncelleştirmeleri

WDDM 2.5 için, paravirtualizasyon desteği için aşağıdaki DDI değişiklikleri de gereklidir.

Ev sahibi KMD tarafından misafir etkinliklerinin sinyali

KMD'nin UMD tarafından oluşturulan bir olaya işaret etmesi gerektiğinde sanallaştırma olmadan var olan senaryolar vardır. Paravirtualizasyon kullanılırken bu tür senaryoları yönetmek için, konaktaki KMD'nin, misafir sistemde oluşturulan bir olayı işaret etmesi gerekir. Bu amaçla DxgkCbSignalEvent geri çağırma fonksiyonu eklenir. KMD, ana bilgisayara ait işlemlerin olaylarını belirtmek için bu geri çağırmayı da kullanabilir.

VM'de UMD tarafından sağlanan tanıtıcılar için destek

Belirli sürücü geri çağırmaları, UMD tarafından iletilen Dxgkrnl ayırma veya kaynak tanıtıcısını kabul eder, örneğin:

Ana bilgisayardaki çağrılar, DxgkDdiXxx işlevini çağıran aynı iş parçacığı bağlamında gerçekleştirilmelidir.

Örneğin, sanallaştırma olmadan, KMD'nin, D3DKMTEscapeçağrısını yapan kullanıcı modu iş parçacığının bağlamında, DxgkCbAcquireHandleData'i ve ardından DxgkDdiEscapeçağrısını çağırdığını varsayalım.

UMD bir sanal makinede çalıştığında, yalnızca misafir ayırma tanıtıcılarını bilir ve KMD konak sistemde çalıştığı için bu tanıtıcıları KMD'ye iletemez. Misafirdeki UMD, D3DKMTEscape çağrısını yapar ve konaktaki KMD ilgili DxgkDdiEscape çağrısını alır. KMD'nin DxgkCbAcquireHandleData'yi bu iş parçacığı bağlamında çağırması gerekir.

İlgili konak tutamacına konuk ayırma/kaynak tutamacının çevirisi için D3DDDI_ESCAPEFLAGS::DriverKnownEscape sürücü kaçış bayrağı eklenir.

D3DKMTEscape'yi, DriverKnownEscape bayrağı ayarlanmış şekilde çağırdığınızda:

  • D3DKMT_ESCAPE::Type değerini D3DKMT_ESCAPE_DRIVERPRIVATEolarak ayarlayın.

  • D3DKMT_ESCAPE::p PrivateDriverData,aşağıdaki bölümde tanımlanan bilinen bir sürücü kaçış yapısına işaret etmek için ayarlayın. Her yapı bir D3DDDI_DRIVERESCAPETYPE değeriyle başlar.

Sanallaştırma kullanılmadığında, çevrilen tutamaç giriş tutamaç ile aynıdır.

Aşağıdaki bilinen sürücü kaçışları tanımlanır.

Aşağıdaki kod parçacığında DriverKnownEscape bayrağının nasıl kullanılacağı gösterilmektedir.

D3DDDI_DRIVERESCAPE_TRANSLATEALLOCATIONEHANDLE Command = {};
    Command.EscapeType = D3DDDI_DRIVERESCAPETYPE_TRANSLATEALLOCATIONHANDLE;
    Command.hAllocation = hAlloc;
    D3DKMT_ESCAPE Args = {};
    Args.hAdapter = hAdapter;
    Args.Flags.DriverKnownEscape = TRUE;
    Args.Type = D3DKMT_ESCAPE_DRIVERPRIVATE;
    Args.pPrivateDriverData = &Command;
    Args.PrivateDriverDataSize = sizeof(Command);
    Status = D3DKMTEscape(&Args);

WDDM 2.6 DDI güncelleştirmeleri

WDDM 2.6'dan (Windows 10, sürüm 1903) başlayarak, sanallaştırma desteği için aşağıdaki güncelleştirmeler yapıldı: