Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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:
- DxgkDdiSetVirtualMachineDataSecureVirtualMachine bayrağı ayarlanmıştır.
- DxgkDdiQueryAdapterInfoSecureVirtualMachine bayrağı ayarlanmıştır.
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_PolicyD3DEnableFeature.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:
- D3DDDI_QUERYREGISTRY_INFO::QueryType kayıt defteri erişiminin türünü belirtir; örneğin, hizmet anahtarı, bağdaştırıcı anahtarı veya sürücü deposu yolu.
- D3DDDI_QUERYREGISTRY_FLAGS::QueryFlags sorgunun bayraklarını belirtir.
- ValueName okunacak değerin adını tanımlar.
- ValueType okunacak değerin türünü belirtir.
-
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:
- CopyToVmOverwrite
- CopyToVmWhenNewer
- CopyToVmOverwriteWow64
- 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:
- D3DKMTSubmitCommand
- D3DKMTSubmitCommandToHardwareQueue
- D3DKMTSignalSynchronizationObjectFromGpu
- D3DKMTWaitForSynchronizationObjectFromGpu
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:
- DXGK_FEATURE_LDA_GPUPV etkinleştirildiğinde gerçek fiziksel bağdaştırıcı sayısı.
- Aksi takdirde, 1.
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.
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.
(isteğe bağlı) Test imzalamayı etkinleştir (bcdedit -set TESTSIGNING ON)
Yeniden başlat.
Yarı sanallaştırmayı destekleyen bir GPU sürücüsü yükleyin.
(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İş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 : FalseGPU 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 $vmVM 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[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" }VM'ye bir sanal GPU ekleyin ve denetim noktalarını devre dışı bırakın.
Add-VMGpuPartitionAdapter -VMName $vm Set-VM -CheckpointType Disabled -VMName $vmVM'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 :VM'de kullandığınız istemci derlemesinin VHDX'ini bir konak dizinine kopyalayın. Örneğin,
d:\VM\os.vhdx.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.vhdxseç
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.
Sürücünün
%windir%\system32veya%windir%\syswow64dosyalarına erişmesi gerekiyorsa, dosyaları el ile VM'ye kopyalayın.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 onVM'nin VHDX'ini çıkarın.
VM'yi başlatın.
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-VMGpuPartitionAdapterkomutunu 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.exekullanı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:
- Özel verilerde hiçbir işaretçi iletemezsiniz.
- Özel verilerde hiçbir tanıtıcı geçiremez.
- 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ı:
Sürücü, sanal makinede DXGK_ALLOCATIONINFOFLAGS::ACCESSEDPHYSICALLY bayrağını kullanabilir. WDDM 2.6'nın öncesinde, sürücü bu bayrağı bir sanal makinede kullanamadı ve bu bayrakla ayırma oluşturulamadı.
UMD, sanal makinede pfnd3dkmtUpdateallocationproperty kullanabilir. WDDM 2.6'den önce bu çağrı başarısız olur.