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.
Sanal Güvenli Mod (VSM), işletim sistemi yazılımı içinde yeni güvenlik sınırlarının oluşturulmasını ve yönetilmesini sağlayan konak ve konuk bölümlerine sunulan bir hiper yönetici özellikleri ve aydınlatmaları kümesidir. VSM, Device Guard, Credential Guard, sanal TPM'ler ve korumalı VM'ler gibi Windows güvenlik özelliklerinin dayandığı hiper yönetici tesisidir. Bu güvenlik özellikleri Windows 10 ve Windows Server 2016'da kullanıma sunulmuştur.
VSM, kök ve konuk bölümlerinde işletim sistemi yazılımının, sistem güvenlik varlıklarının depolanması ve işlenmesi için yalıtılmış bellek bölgeleri oluşturmasını sağlar. Bu yalıtılmış bölgelere erişim, yalnızca sistemin Güvenilen İşlem Tabanı'nın (TCB) yüksek ayrıcalıklı, son derece güvenilir bir parçası olan hiper yönetici aracılığıyla denetlenip verilir. Hiper yönetici işletim sistemi yazılımından daha yüksek bir ayrıcalık düzeyinde çalıştığından ve sistem başlatmanın başlarında CPU MMU ve IOMMU'daki bellek erişim izni denetimleri gibi önemli sistem donanım kaynakları üzerinde özel denetime sahip olduğundan, hiper yönetici bu yalıtılmış bölgeleri, gözetmen modu erişimine sahip işletim sistemi yazılımından (işletim sistemi çekirdeği ve cihaz sürücüleri gibi) bile yetkisiz erişime karşı koruyabilir (CPL0, veya "Halka 0").
Bu mimaride, gözetmen modunda çalışan normal sistem düzeyindeki yazılımlar (örn. çekirdek, sürücüler vb.) kötü amaçlı yazılımlar tarafından ele geçirilse bile, hiper yönetici tarafından korunan yalıtılmış bölgelerdeki varlıklar güvende kalabilir.
Sanal Güven Düzeyi (VTL)
VSM, Sanal Güven Düzeyleri (VTL) aracılığıyla yalıtımı sağlar ve korur. VTL'ler hem bölüm başına hem de sanal işlemci temelinde etkinleştirilir ve yönetilir.
Sanal Güven Düzeyleri hiyerarşiktir ve daha yüksek düzeyler daha düşük düzeylerden daha ayrıcalıklıdır. VTL0, VTL1'in VTL0'den daha ayrıcalıklı olması, VTL2'nin VTL1'den daha ayrıcalıklı olması vb. ile en düşük ayrıcalıklı düzeydir.
Mimari olarak en fazla 16 VTL düzeyi desteklenir; ancak bir hiper yönetici 16'dan az VTL uygulamayı seçebilir. Şu anda yalnızca iki VTL uygulanıyor.
typedef UINT8 HV_VTL, *PHV_VTL;
#define HV_NUM_VTLS 2
#define HV_INVALID_VTL ((HV_VTL) -1)
#define HV_VTL_ALL 0xF
Her VTL'nin kendi bellek erişim korumaları kümesi vardır. Bu erişim korumaları bir bölümün fiziksel adres alanında hiper yönetici tarafından yönetilir ve bu nedenle bölümde çalışan sistem düzeyinde yazılım tarafından değiştirilemez.
Daha ayrıcalıklı VTL'ler kendi bellek korumalarını zorabileceğinden, daha yüksek VTL'ler bellek alanlarını daha düşük VTL'lerden etkili bir şekilde koruyabilir. Uygulamada bu, daha düşük bir VTL'nin yalıtılmış bellek bölgelerini daha yüksek bir VTL ile güvenli hale getirerek korumasını sağlar. Örneğin, VTL0 bir gizli diziyi VTL1'de depolayabilir ve bu noktada yalnızca VTL1 bu gizli diziye erişebilir. VTL0 ele geçirilse bile gizli dizi güvenli olur.
VTL Korumaları
VTL'ler arasında yalıtım elde etmek için birden çok model vardır:
- Bellek Erişim Korumaları: Her VTL, bir konuk fiziksel bellek erişim korumaları kümesi tutar. Belirli bir VTL'de çalışan yazılımlar yalnızca bu korumalara uygun olarak belleğe erişebilir.
- Sanal İşlemci Durumu: Sanal işlemciler VTL başına ayrı bir durum tutar. Örneğin, her VTL bir özel VP yazmaç kümesi tanımlar. Daha düşük bir VTL'de çalışan yazılımlar, daha yüksek VTL'nin özel sanal işlemcisinin kayıt durumuna erişemez.
- Kesmeler: Ayrı bir işlemci durumuyla birlikte her VTL'nin kendi kesme alt sistemi de vardır (x64 üzerinde yerel APIC, ARM64'te GIC CPU arabirimi). Bu, daha yüksek VTL'lerin daha düşük bir VTL'den müdahale riski olmadan kesintileri işlemesine olanak tanır.
- Katman Sayfaları: Daha yüksek VTL'lerin güvenilir erişime sahip olması için VTL başına belirli katman sayfaları korunur. Örneğin, VTL başına ayrı bir hiper çağrı katman sayfası vardır.
VSM Algılama ve Durumu
VSM özelliği, AccessVsm bölüm ayrıcalığı bayrağı aracılığıyla bölümlere tanıtılır. Yalnızca aşağıdaki ayrıcalıkların tümüne sahip bölümler VSM kullanabilir: AccessVsm, AccessVpRegisters ve AccessSynicRegs.
VSM Yetenek Algılama
Konuklar yapay kayıt aracılığıyla VSM özellikleriyle ilgili bir rapora erişebilir.
x64 Platformlarında
x64 platformlarında, bu yazmaç bir MSR aracılığıyla erişilir:
| MSR adresi | Kayıt Adı | Description |
|---|---|---|
| 0x000D0006 | HV_X64_REGISTER_VSM_CAPABILITIES | VSM özellikleriyle ilgili rapor. |
ARM64 Platformlarında
ARM64 platformlarında bu yazmaç HvRegisterVsmCapabilities aracılığıyla HvCallGetVpRegisters hiper çağrı kullanılarak erişilir.
Kayıt Biçimi
x64 Platformlarında
| Bitler | Description | Attributes |
|---|---|---|
| 63 | Dr6Shared | Read |
| 62:47 | MbecVtlMask | Read |
| 46 | DenyLowerVtlStartup | Read |
| 45:0 | RsvdZ | Read |
ARM64 Platformlarında
| Bitler | Description | Attributes |
|---|---|---|
| 63 | RsvdZ | Read |
| 62:47 | MbecVtlMask | Read |
| 46 | DenyLowerVtlStartup | Read |
| 45:0 | RsvdZ | Read |
Alan Açıklamaları
Dr6Shared (yalnızca x64): Konuk için Dr6'nın VTL'ler arasında paylaşılan bir kayıt olup olmadığını gösterir.
MbecVtlMask: Konuk için MBEC'nin etkinleştirilebileceği VTL'leri gösterir.
DenyLowerVtlStartup: Bir VTL'nin daha düşük bir VTL ile VP sıfırlamasını reddedip reddedemeyeceğini konuk için gösterir.
VSM Durum Kaydı
Bölüm ayrıcalığı bayrağına ek olarak, VSM durumu hakkında ek bilgi edinmek için iki sanal yazmaç kullanılabilir: HvRegisterVsmPartitionStatus ve HvRegisterVsmVpStatus.
HvRegisterVsmPartitionStatus
HvRegisterVsmPartitionStatus, tüm VTL'ler arasında paylaşılan bölüm başına salt okunur bir kayıttır. Bu kayıt, bölüm için hangi VTL'lerin etkinleştirildiği, hangi VTL'lerin Mod Tabanlı Yürütme Denetimleri'nin etkinleştirildiği ve izin verilen en fazla VTL ile ilgili bilgi sağlar.
typedef union
{
UINT64 AsUINT64;
struct
{
UINT64 EnabledVtlSet : 16;
UINT64 MaximumVtl : 4;
UINT64 MbecEnabledVtlSet: 16;
UINT64 ReservedZ : 28;
};
} HV_REGISTER_VSM_PARTITION_STATUS;
HvRegisterVsmVpStatus
HvRegisterVsmVpStatus salt okunur bir kayıttır ve tüm VTL'ler arasında paylaşılır. Her sanal işlemcinin kendi örneğini koruduğu anlamına gelen vp yazmaç başına bir kayıttır. Bu kayıt, hangi VTL'lerin etkinleştirildiği, hangilerinin etkin olduğu ve bir VP'de etkin OLAN MBEC modu hakkında bilgi sağlar.
typedef union
{
UINT64 AsUINT64;
struct
{
UINT64 ActiveVtl : 4;
UINT64 ActiveMbecEnabled : 1;
UINT64 ReservedZ0 : 11;
UINT64 EnabledVtlSet : 16;
UINT64 ReservedZ1 : 32;
};
} HV_REGISTER_VSM_VP_STATUS;
ActiveVtl, sanal işlemcide şu anda etkin olan VTL bağlamının kimliğidir.
ActiveMbecEnabled, MBEC'nin şu anda sanal işlemcide etkin olduğunu belirtir.
EnabledVtlSet, sanal işlemcide etkinleştirilen VTL'lerin bit eşlemidir.
Bölüm VTL başlangıç durumu
Bir bölüm başlatıldığında veya sıfırlandığında VTL0'da çalışmaya başlar. Diğer tüm VTL'ler bölüm oluşturma sırasında devre dışı bırakılır.
VTL Etkinleştirme
VTL kullanmaya başlamak için daha düşük bir VTL'nin aşağıdakileri başlatması gerekir:
- Bölüm için hedef VTL'yi etkinleştirin. Bu, VTL'yi bölüm için genel olarak kullanılabilir hale getirir.
- Bir veya daha fazla sanal işlemcide hedef VTL'yi etkinleştirin. Bu, VTL'yi bir VP için kullanılabilir hale getirir ve ilk bağlamını ayarlar. Tüm VM'lerin aynı etkin VTL'lere sahip olması önerilir. Bazı VM'lerde (tümü değil) VTL'nin etkinleştirilmesi beklenmeyen davranışlara yol açabilir.
- VTL bir bölüm ve VP için etkinleştirildikten sonra EnableVtlProtection bayrağı ayarlandıktan sonra erişim korumalarını ayarlamaya başlayabilir.
VTL'lerin ardışık olması gerekmediğini unutmayın.
Bölüm için Hedef VTL'yi Etkinleştirme
HvCallEnablePartitionVtl hiper çağrısı, belirli bir bölüm için VTL'yi etkinleştirmek için kullanılır. Yazılımın belirli bir VTL'de yürütülebilmesi için önce bölümdeki sanal işlemcilerde VTL'nin etkinleştirilmesi gerektiğini unutmayın.
Sanal İşlemciler için Hedef VTL'yi Etkinleştirme
Bir bölüm için VTL etkinleştirildikten sonra, bölümün sanal işlemcilerinde etkinleştirilebilir. HvCallEnableVpVtl hiper çağrısı, ilk bağlamını ayarlayan bir sanal işlemci için VTL'leri etkinleştirmek için kullanılabilir.
Sanal işlemcilerin VTL başına bir "bağlamı" vardır. Bir VTL değiştirilirse, VTL'nin özel durumu da değiştirilir.
VTL Yapılandırması
VTL etkinleştirildikten sonra, yapılandırması eşit veya daha yüksek bir VTL'de çalışan bir VP tarafından değiştirilebilir.
Bölüm Yapılandırması
Bölüm genelindeki öznitelikler HvRegisterVsmPartitionConfig yazmaç kullanılarak yapılandırılabilir. Her bölümdeki her VTL (0'dan büyük) için bu kaydın bir örneği vardır.
Her VTL kendi HV_REGISTER_VSM_PARTITION_CONFIG örneğini ve daha düşük VTL örneklerini değiştirebilir. VTL'ler bu yazmaçta daha yüksek VTL'ler için değişiklik yapmayabilir.
typedef union
{
UINT64 AsUINT64;
struct
{
UINT64 EnableVtlProtection : 1;
UINT64 DefaultVtlProtectionMask : 4;
UINT64 ZeroMemoryOnReset : 1;
UINT64 DenyLowerVtlStartup : 1;
UINT64 ReservedZ : 2;
UINT64 InterceptVpStartup : 1;
UINT64 ReservedZ : 54; };
} HV_REGISTER_VSM_PARTITION_CONFIG;
Bu kaydın alanları aşağıda açıklanmıştır.
VTL Korumalarını Etkinleştirme
Bir VTL etkinleştirildikten sonra, bellek korumaları uygulamaya başlamadan önce EnableVtlProtection bayrağı ayarlanmalıdır. Bu bayrak bir kez yazılır, yani bir kez ayarlandıktan sonra değiştirilemez.
Varsayılan Koruma Maskesi
Varsayılan olarak sistem, şu anda eşlenmiş olan tüm sayfalara ve gelecekteki "sık eklenen" sayfalara RWX korumaları uygular. Sık eklenen sayfalar, yeniden boyutlandırma işlemi sırasında bölüme eklenen tüm belleğe başvurur.
Daha yüksek bir VTL, HV_REGISTER_VSM_PARTITION_CONFIG defaultVtlProtectionMask belirterek farklı bir varsayılan bellek koruma ilkesi ayarlayabilir. Bu maske, VTL etkinleştirildiğinde ayarlanmalıdır. Ayarlandıktan sonra değiştirilemez ve yalnızca bir bölüm sıfırlaması ile temizlenir.
| Parça | Description |
|---|---|
| 0 | Read |
| 1 | Write |
| 2 | Çekirdek Modu Yürütme (KMX) |
| 3 | Kullanıcı Modu Yürütme (UMX) |
Sıfırlandığında Sıfır bellek
ZeroMemOnReset, bir bölüm sıfırlamadan önce belleğin sıfırlanmış olup olmadığını denetleen bir bittir. Bu yapılandırma varsayılan olarak açıktır. Bit ayarlanırsa, daha yüksek bir VTL'nin belleğinin daha düşük bir VTL tarafından tehlikeye atılamaması için bölüm belleği sıfırlanır. Bu bit temizlenirse, sıfırlamada bölümün belleği sıfırlanmaz.
DenyLowerVtlStartup
DenyLowerVtlStartup bayrağı, bir sanal işlemcinin düşük VTL'ler tarafından başlatılıp başlatılmayabileceğini veya sıfırlanabileceğini denetler. Bu, bir sanal işlemciyi (örneğin X64 üzerinde SIPI) ve HvCallStartVirtualProcessor hiper çağrısını sıfırlamanın mimari yollarını içerir.
InterceptVpStartup
InterceptVpStartup bayrağı ayarlanırsa, bir sanal işlemcinin başlatılması veya sıfırlanması, daha yüksek VTL'ye yönelik bir kesme noktası oluşturur.
Alt VM'leri yapılandırma
Aşağıdaki kayıt, düşük VTL'lerin davranışını yapılandırmak için daha yüksek VTL'ler tarafından kullanılabilir:
typedef union
{
UINT64 AsUINT64;
struct
{
UINT64 MbecEnabled : 1;
UINT64 TlbLocked : 1;
UINT64 ReservedZ : 62;
};
} HV_REGISTER_VSM_VP_SECURE_VTL_CONFIG;
Her VTL (0'dan yüksek) kendisinden daha düşük olan her VTL için bu yazmaç örneğine sahiptir. Örneğin, VTL2 bu yazmaç için iki örneğe sahiptir: biri VTL1 için, diğeri VTL0 için.
Bu kaydın alanları aşağıda açıklanmıştır.
MbecEnabled
Bu alan, düşük VTL için MBEC'nin etkinleştirilip etkinleştirilmediğini yapılandırıyor.
TlbLocked
Bu alan, alt VTL'nin TLB'sini kilitler. Bu özellik, düşük VTL'lerin daha yüksek bir VTL'yi etkileyebilecek TLB geçersizleştirmelerine neden olmasını önlemek için kullanılabilir. Bu bit ayarlandığında, alt VTL'den gelen tüm adres alanı boşaltma istekleri kilit kaldırılana kadar engellenir.
TLB'nin kilidini açmak için, daha yüksek VTL bu biti temizleyebilir. Ayrıca, bir VP daha düşük bir VTL'ye döndüğünde, o sırada tuttuğu tüm TLB kilitlerini serbest bırakır.
VTL Girdisi
Vp daha düşük bir VTL'den daha yüksek bir VTL'ye geçtiğinde VTL "girilir". Bu durum aşağıdaki nedenlerle oluşabilir:
- VTL çağrısı: Bu, yazılımın açıkça daha yüksek bir VTL'de kod çağırmak istediği durumdur.
- Güvenli kesme: Daha yüksek bir VTL için kesme alınırsa, VP daha yüksek VTL girer.
- Güvenli kesme: Belirli eylemler güvenli bir kesme tetikler (örneğin, belirli MSR'lere erişilir).
Bir VTL girildikten sonra, kendi isteğiyle çıkmalıdır. Daha yüksek bir VTL daha düşük bir VTL tarafından önlenemez.
VTL Giriş Nedenini Belirleme
Bir girdiye uygun şekilde tepki vermek için, daha yüksek bir VTL'nin girilmesi nedenini bilmesi gerekebilir. Giriş nedenleri arasında ayrım yapmak için VTL girişi HV_VP_VTL_CONTROL yapısına dahil edilir.
VTL Çağrısı
"VTL çağrısı", daha düşük bir VTL'nin HvCallVtlCall hiper çağrısı aracılığıyla daha yüksek bir VTL'ye giriş başlatması (örneğin, daha yüksek VTL'ye sahip bir bellek bölgesini korumak için) olmasıdır.
VTL çağrıları, VTL anahtarları arasında paylaşılan yazmaçların durumunu korur. Özel yazmaçlar VTL düzeyinde korunur. Bu kısıtlamaların istisnası, VTL çağrı dizisi için gereken yazmaçlar/yönergelerdir.
x64 Platformlarında
x64 üzerindeki bir VTL çağrısı için aşağıdaki yazmaçlar gereklidir:
| x64 | x86 | Description |
|---|---|---|
| RCX | EDX:EAX | Hiper yöneticiye bir VTL çağrı denetimi girişi belirtir |
| RAX | ECX | Rezerve edildi |
VTL çağrı denetimi girişindeki tüm bitler şu anda ayrılmıştır.
ARM64 Platformlarında
ARM64 platformlarında, hemen değer 2 olan HVC yönergesi kullanılarak bir VTL çağrısı başlatılır. Hiper yönetici bu özel anlık değerin kodunu çözer ve HvCallVtlCall hiper çağrısı olarak işler. ARM64'te denetim girişi için belirli bir yazmaç durumu gerekmez.
VTL Çağrı Kısıtlamaları
VTL çağrıları yalnızca en ayrıcalıklı işlemci modundan başlatılabilir. Örneğin, x64 sistemlerinde VTL çağrısı yalnızca CPL0'den ve ARM64 sistemlerinde EL1'den gelebilir. Sistemdeki en ayrıcalıklı mod dışında herhangi bir şey olan bir işlemci modundan başlatılan bir VTL çağrısı, hiper yöneticinin sanal işlemciye bir özel durum eklemesine neden olur (x64'te #UD, ARM64'te tanımlanmamış yönerge özel durumu).
VTL çağrısı yalnızca bir sonraki en yüksek VTL'ye geçebilir. Başka bir deyişle, etkinleştirilen birden çok VTL varsa, bir çağrı bir VTL'yi "atlayamaz". Aşağıdaki eylemler bir özel durumla sonuçlanır (x64'te #UD, ARM64'te tanımsız yönerge):
- Sistemdeki en ayrıcalıklı mod (mimariye özgü) dışında herhangi bir şey olan bir işlemci modundan başlatılan bir VTL çağrısı.
- Gerçek moddan VTL çağrısı (yalnızca x86/x64)
- Hedef VTL'nin devre dışı bırakıldığı (veya henüz etkinleştirilmediği) sanal işlemcide VTL çağrısı.
- Geçersiz denetim giriş değerine sahip bir VTL çağrısı
VTL Çıkışı
Daha düşük bir VTL'ye geçiş "return" olarak bilinir. Bir VTL işlemini tamamladıktan sonra, daha düşük bir VTL'ye geçmek için bir VTL iadesi başlatabilir. VTL iadesinin gerçekleşmesinin tek yolu, daha yüksek bir VTL'nin gönüllü olarak bir tane başlatmasıdır. Daha düşük bir VTL hiçbir zaman daha yüksek bir VTL'nin başına getiremez.
VTL İadesi
"VTL dönüşü", daha yüksek bir VTL'nin HvCallVtlReturn hiper çağrı aracılığıyla daha düşük bir VTL'ye geçiş başlatmasıdır. VTL çağrısına benzer şekilde, özel işlemci durumu değiştirilir ve paylaşılan durum yerinde kalır. Alt VTL açıkça daha yüksek VTL'ye çağrıldıysa, hiper yönetici, VTL çağrısından sonra devam edebilmesi için dönüş tamamlanmadan önce daha yüksek VTL'nin yönerge işaretçisini artırır.
x64 Platformlarında
x64 üzerindeki bir VTL Return kod dizisi için aşağıdaki yazmaçların kullanılması gerekir:
| x64 | x86 | Description |
|---|---|---|
| RCX | EDX:EAX | Hiper yöneticiye bir VTL dönüş denetimi girişi belirtir |
| RAX | ECX | Rezerve edildi |
ARM64 Platformlarında
ARM64 platformlarında, hemen değer 3 olan HVC yönergesi kullanılarak bir VTL dönüşü başlatılır. Hiper yönetici bu özel anlık değerin kodunu çözer ve HvCallVtlReturn hypercall olarak işler.
VTL Dönüş Denetimi Girişi
VTL dönüş denetimi girişi aşağıdaki biçime sahiptir:
| Bitler | Veri Alanı | Description |
|---|---|---|
| 63:1 | RsvdZ | |
| 0 | Hızlı dönüş | Yazmaçlar geri yüklenmiyor |
Aşağıdaki eylemler bir #UD özel durumu oluşturur:
- En düşük VTL şu anda etkin olduğunda VTL döndürmeyi deneme
- Geçersiz bir denetim giriş değeriyle VTL döndürülmesi deneniyor
- Sistemdeki en ayrıcalıklı mod dışında herhangi bir şey olan bir işlemci modundan VTL döndürmeyi deneme (mimariye özgü)
Hızlı Dönüş
Bir dönüşü işlemenin bir parçası olarak hiper yönetici HV_VP_VTL_CONTROL yapısından düşük VTL'nin kayıt durumunu geri yükleyebilir. Örneğin, güvenli bir kesmeyi işledikten sonra daha yüksek bir VTL, düşük VTL'nin durumunu kesintiye uğratmadan geri dönmek isteyebilir. Bu nedenle hiper yönetici, alt VTL'nin yazmaçlarını VTL denetim yapısında depolanan çağrı öncesi değerlerine geri yüklemek için bir mekanizma sağlar.
Bu davranış gerekli değilse, daha yüksek bir VTL "hızlı dönüş" kullanabilir. Hızlı dönüş, hiper yöneticinin kayıt durumunu denetim yapısından geri yüklememesidir. Gereksiz işlemeyi önlemek için mümkün olduğunda bu kullanılmalıdır.
Bu alan, VTL dönüş girişinin bit 0'ıyla ayarlanabilir. 0 olarak ayarlanırsa, yazmaçlar HV_VP_VTL_CONTROL yapısından geri yüklenir. Bu bit 1 olarak ayarlanırsa, yazmaçlar geri yüklenmez (hızlı dönüş).
Hypercall Sayfa Yardımı (Yalnızca x64)
x64 platformlarında, hiper yönetici VTL çağrılarına yardımcı olacak mekanizmalar sağlar ve hiper çağrı sayfası aracılığıyla döndürür. Bu sayfa, VTL'leri değiştirmek için gereken belirli kod dizisini soyutlar.
VTL çağrılarını ve dönüşlerini yürütmek için kod dizilerine, hypercall sayfasında belirli yönergeler yürütülerek erişilebilir. Çağrı/dönüş öbekleri, HvRegisterVsmCodePageOffsets sanal yazmaç tarafından belirlenen hiper çağrı sayfasında bir uzaklıkta bulunur. Bu, VTL başına ayrı bir örneği olan salt okunur ve bölüm genelinde bir yazmaçtır.
VTL, CALL yönergesini kullanarak bir VTL çağrısı/dönüş yürütebilir. Hypercall sayfasındaki doğru konuma yapılan BIR CALL, VTL çağrısı/dönüş başlatır.
typedef union
{
UINT64 AsUINT64;
struct
{
UINT64 VtlCallOffset : 12;
UINT64 VtlReturnOffset : 12;
UINT64 ReservedZ : 40;
};
} HV_REGISTER_VSM_CODE_PAGE_OFFSETS;
Özetlemek gerekirse, x64'te hypercall sayfasını kullanarak bir kod dizisi çağırma adımları aşağıdaki gibidir:
- Hiper çağrı sayfasını bir VTL'nin GPA alanına eşleme
- Kod dizisi için doğru uzaklığı belirleme (VTL çağrısı veya dönüş).
- CALL kullanarak kod dizisini yürütür.
Not: ARM64 platformlarında VTL çağrıları ve dönüşleri, VTL Çağrısı ve VTL Return bölümlerinde açıklandığı gibi belirli anlık değerlerle (VTL çağrısı için 2, VTL dönüşü için 3) HVC yönergesi kullanılarak doğrudan gerçekleştirilir. HvRegisterVsmCodePageOffsets yazmaç ARM64'te kullanılamaz.
Bellek Erişim Korumaları
VSM tarafından sağlanan gerekli korumalardan biri, bellek erişimlerini yalıtma özelliğidir.
Daha yüksek VTL'ler, düşük VTL'ler tarafından izin verilen bellek erişimi türü üzerinde yüksek düzeyde denetime sahiptir. Belirli bir GPA sayfası için daha yüksek bir VTL tarafından belirtilebilen üç temel koruma türü vardır: Okuma, Yazma ve eXecute. Bunlar aşağıdaki tabloda tanımlanmıştır:
| İsim | Description |
|---|---|
| Read | Bellek sayfasına okuma erişimine izin verilip verilmeyeceğini denetler |
| Write | Bellek sayfasına yazma erişimine izin verilip verilmeyeceğini denetler |
| Uygula | Bellek sayfası için yönerge getirme işlemlerine izin verilip verilmeyeceğini denetler. |
Bu üçü aşağıdaki bellek koruması türleri için birleştirilir:
- Erişim yok
- Salt okunur, yürütme yok
- Salt okunur, yürütme
- Okuma/yazma, yürütme yok
- Okuma/yazma, yürütme
"Mod tabanlı yürütme denetimi (MBEC)" etkinleştirilirse, kullanıcı ve çekirdek modu yürütme korumaları ayrı olarak ayarlanabilir.
Daha yüksek VTL'ler , HvCallModifyVtlProtectionMask hiper çağrısı aracılığıyla bir GPA için bellek korumasını ayarlayabilir.
Bellek Koruma Hiyerarşisi
Bellek erişim izinleri belirli bir VTL için bir dizi kaynak tarafından ayarlanabilir. Her VTL'nin izinleri bir dizi diğer VTL ile ve konak bölümüyle kısıtlanabilir. Korumaların uygulanma sırası aşağıdaki gibidir:
- Konak tarafından ayarlanan bellek korumaları
- Daha yüksek VTL'ler tarafından ayarlanan bellek korumaları
Başka bir deyişle, VTL korumaları konak korumalarının yerini alır. Üst düzey VTL'ler alt düzey VTL'lerin yerini alır. Bir VTL'nin kendisi için bellek erişim izinleri ayarlayamayabilir.
Uyumlu bir arabirimin RAM üzerinde RAM olmayan herhangi bir türü kaplamaması beklenir.
Bellek Erişim İhlalleri
Daha düşük bir VTL'de çalışan bir VP daha yüksek bir VTL tarafından ayarlanan bir bellek korumasını ihlal etmeye çalışırsa, bir kesme noktası oluşturulur. Bu kesme noktası, korumayı ayarlayan daha yüksek VTL tarafından alınır. Bu, daha yüksek VTL'lerin büyük/küçük harf temelinde ihlalle başa çıkmalarına olanak tanır. Örneğin, yüksek VTL bir hata döndürmeyi veya erişimi öykünmeyi seçebilir.
Mod Tabanlı Yürütme Denetimi (MBEC)
Bir VTL daha düşük bir VTL'ye bellek kısıtlaması yerleştirdiğinde, "yürütme" ayrıcalığı verilirken kullanıcı ve çekirdek modu arasında ayrım yapmak isteyebilir. Örneğin, kod bütünlüğü denetimleri daha yüksek bir VTL'de gerçekleştirilecekse, kullanıcı modu ile çekirdek modu arasında ayrım yapabilme özelliği, VTL'nin yalnızca çekirdek modu uygulamaları için kod bütünlüğünü zorunlu kabileceği anlamına gelir.
MBEC, geleneksel üç bellek korumasının (okuma, yazma, yürütme) dışında, yürütme korumaları için kullanıcı modu ile çekirdek modu arasında ayrım sağlar. Bu nedenle, MBEC etkinleştirilirse bir VTL dört tür bellek koruması ayarlama fırsatına sahiptir:
| İsim | Description |
|---|---|
| Read | Bellek sayfasına okuma erişimine izin verilip verilmeyeceğini denetler |
| Write | Bellek sayfasına yazma erişimine izin verilip verilmeyeceğini denetler |
| Kullanıcı Modu Yürütme (UMX) | Bellek sayfası için kullanıcı modunda oluşturulan yönerge getirme işlemlerine izin verilip verilmeyeceğini denetler. NOT: MBEC devre dışı bırakılırsa, bu ayar yoksayılır. |
| Çekirdek Modu Yürütme (KMX) | Bir bellek sayfası için çekirdek modunda oluşturulan yönerge getirme işlemlerine izin verilip verilmeyeceğini denetler. NOT: MBEC devre dışı bırakılırsa, bu ayar hem kullanıcı modu hem de çekirdek modu yürütme erişimlerini denetler. |
"User-Mode Yürüt" korumalarıyla işaretlenmiş bellek yalnızca sanal işlemci kullanıcı modunda çalışırken yürütülebilir. Benzer şekilde, "Kernel-Mode Yürüt" belleği yalnızca sanal işlemci çekirdek modunda çalışırken yürütülebilir.
KMX ve UMX, yürütme izinlerinin kullanıcı ve çekirdek modu arasında farklı şekilde zorlanması için bağımsız olarak ayarlanabilir. KMX=1, UMX=0 dışında UMX ve KMX'in tüm birleşimleri desteklenir. Bu birleşimin davranışı tanımlanmamıştır.
MBEC tüm VTL'ler ve sanal işlemciler için varsayılan olarak devre dışıdır. MBEC devre dışı bırakıldığında, çekirdek modu yürütme biti bellek erişim kısıtlamasını belirler. Bu nedenle, MBEC devre dışı bırakılırsa KMX=1 kodu hem çekirdek hem de kullanıcı modunda yürütülebilir.
Tanımlayıcı Tabloları (Yalnızca x64)
x64 platformlarında, tanımlayıcı tablolara erişen tüm kullanıcı modu kodları KMX=UMX=1 olarak işaretlenmiş GPA sayfalarında olmalıdır. KMX=0 işaretli bir GPA sayfasından tanımlayıcı tablolara erişen kullanıcı modu yazılımları desteklenmez ve genel koruma hatasına neden olur.
ARM64, x86 stili tanımlayıcı tabloları kullanmaz; bellek erişim izinleri, çeviri tablosu girişleri ve EL tabanlı ayrıcalık modeli aracılığıyla denetlenmektedir.
MBEC yapılandırması
Mod tabanlı yürütme denetimini kullanmak için iki düzeyde etkinleştirilmesi gerekir:
- Bir bölüm için VTL etkinleştirildiğinde, MBEC'nin HvCallEnablePartitionVtl kullanılarak etkinleştirilmesi gerekir
- MBEC, HvRegisterVsmVpSecureConfigVtlX kullanılarak VP ve VTL başına temelinde yapılandırılmalıdır.
Gözetmen Modu Yürütme Engellemesi (SMEP) ile MBEC Etkileşimi (Yalnızca x64)
Supervisor-Mode Yürütme Engellemesi (SMEP), x64 platformlarında desteklenen bir işlemci özelliğidir. SMEP, bellek sayfalarına gözetmen erişimini kısıtlaması nedeniyle MBEC'nin çalışmasını etkileyebilir. Hiper yönetici SMEP ile ilgili aşağıdaki ilkelere uyar:
- Konuk işletim sisteminde SMEP kullanılamıyorsa (donanım özellikleri veya işlemci uyumluluk modu nedeniyle), MBEC etkilenmeden çalışır.
- SMEP kullanılabilir ve etkinse, MBEC etkilenmeden çalışır.
- SMEP kullanılabilir durumdaysa ve devre dışı bırakıldıysa, tüm yürütme kısıtlamaları KMX denetimine tabidir. Bu nedenle, yalnızca KMX=1 olarak işaretlenen kodun yürütülmesine izin verilir.
Sanal İşlemci Durumu Yalıtımı
Sanal işlemciler her etkin VTL için ayrı durumlar tutar. Ancak, bu durumun bazıları belirli bir VTL için özeldir ve kalan durum tüm VTL'ler arasında paylaşılır.
Hiper yönetici, her sanal işlemci için VTL başına bağlam tutar ve VTL'ler arasında yalıtılması gereken tüm konuk görünür işlemci durumunu depolar. Her VTL'nin denetim yazmaçları, özel durum vektörleri, sistem yapılandırma yazmaçları ve yapay hiper yönetici kayıtları dahil olmak üzere kendi özel durum örneği vardır. VTL başına bu depolama, güven düzeyleri arasında geçiş yaparken yürütme bağlamının tam olarak yalıtılmasını sağlar.
VTL başına korunan durum (özel durum) VTL geçişleri arasında hiper yönetici tarafından kaydedilir. Bir VTL anahtarı başlatılırsa, hiper yönetici etkin VTL için geçerli özel durumu kaydeder ve ardından hedef VTL'nin özel durumuna geçer. Paylaşılan durum, VTL anahtarlarından bağımsız olarak etkin kalır.
Özel Durum
Her VTL, aşağıdakilerden oluşan kendi tam yürütme bağlamını korur:
- Yürütme Durumu: Yönerge işaretçisi (PC/RIP), yığın işaretçisi (SP/RSP), işlemci bayrakları (PSTATE/RFLAGS)
- Denetim Yazmaçları: Bellek yönetimi yapılandırması (sayfa tabloları, çeviri denetimleri, bellek öznitelikleri)
- Özel Durum İşleme: Özel durum/kesme vektörleri, özel durum sendromu kayıtları, hata adresi kayıtları
- Sistem Yapılandırması: İşlemci özelliği denetimleri, hata ayıklama denetimleri, zamanlayıcı yapılandırması
- Yapay Yazmaçlar: Her VTL'ye özgü hiper yönetici arabirimi kayıtları (hiper arama sayfası, konuk işletim sistemi kimliği, başvuru TSC, yapay kesme denetleyicisi)
Bu yalıtım, her VTL'nin yürütme ortamı üzerinde bağımsız denetime sahip olmasını ve diğer VTL'lerin özel durumunu gözlemlememesini veya müdahale etmemesini sağlar.
x64 Platformlarında
x64 platformlarında her VTL, mimariye özgü MSR'ler aracılığıyla kendi yürütme bağlamını korur ve kaydeder. Hiper yönetici bunları VTL anahtarları arasında koruyarak yürütme ortamının tam yalıtımını sağlar.
Özel MSR'ler sistem çağrı mekanizmalarını, bellek özniteliklerini, işlemci özelliklerini ve hiper yönetici arabirimini denetler.
Mimari MSR'ler:
- SYSENTER_CS, SYSENTER_ESP, SYSENTER_EIP, STAR, LSTAR, CSTAR, SFMASK, EFER, PAT, KERNEL_GSBASE, FS. MERKEZ, GS. TABAN, TSC_AUX
- Yerel APIC yazmaçları (CR8/TPR dahil)
Yapay MSR'ler:
- HV_X64_MSR_HYPERCALL
- HV_X64_MSR_GUEST_OS_ID
- HV_X64_MSR_REFERENCE_TSC
- HV_X64_MSR_APIC_FREQUENCY
- HV_X64_MSR_EOI
- HV_X64_MSR_ICR
- HV_X64_MSR_TPR
- HV_X64_MSR_VP_ASSIST_PAGE
- HV_X64_MSR_NPIEP_CONFIG
- HV_X64_MSR_SIRBP
- HV_X64_MSR_SCONTROL
- HV_X64_MSR_SVERSION
- HV_X64_MSR_SIEFP
- HV_X64_MSR_SIMP
- HV_X64_MSR_EOM
- HV_X64_MSR_SINT0 – HV_X64_MSR_SINT15
- HV_X64_MSR_STIMER0_CONFIG – HV_X64_MSR_STIMER3_CONFIG
- HV_X64_MSR_STIMER0_COUNT – HV_X64_MSR_STIMER3_COUNT
Özel yazmaçlar yürütme ortamını, bellek yönetimini ve özel durum işlemeyi denetler:
- Yürütme Durumu: RIP (yönerge işaretçisi), RSP (yığın işaretçisi), RFLAGS (işlemci bayrakları)
- Bellek Yönetimi: CR0 (işlemci denetimi), CR3 (sayfa tablosu tabanı), CR4 (işlemci özellikleri)
- Tanımlayıcı Tabloları: IDTR (kesme tanımlayıcı tablosu), GDTR (genel tanımlayıcı tablosu)
- Segment Kayıtları: CS, DS, ES, FS, GS, SS, TR, LDTR
- Hata Ayıklama Denetimi: DR7 (hata ayıklama denetimi yazmaç)
- Zaman Damgası: TSC (VTL başına bağımsız zaman başvurusu sağlayan zaman damgası sayacı)
- Hata Ayıklama Durumu: DR6 (hata ayıklama durum kaydı - işlemci türüne bağımlı; paylaşılan veya özel olup olmadığını belirlemek için HvRegisterVsmCapabilities bölümünü okuyun)
ARM64 Platformlarında
ARM64 platformlarında her VTL kendi tam sistem kayıt bağlamını korur. Hiper yönetici bu yazmaçları VTL anahtarları arasında koruyarak yürütme ve özel durum ortamının tam olarak yalıtılmasını sağlar.
Yürütme Durumu denetim programı akışını ve işlemci modunu kaydeder:
- Bilgisayar (program sayacı), SP_EL0, SP_EL1 (yığın işaretçileri)
- PSTATE (işlemci durumu bayrakları), FPCR/FPSR (kayan nokta denetimi/durumu)
- ELR_EL1, SPSR_EL1 (özel durum bağlantı kaydı, kaydedilmiş program durumu)
Bellek Yönetimi ve Çeviri Denetimi kayıtları sanal belleği yapılandırıyor:
- TTBR0_EL1, TTBR1_EL1 (çeviri tablosu temel yazmaçları)
- TCR_EL1 (çeviri denetim kaydı)
- MAIR_EL1 (bellek özniteliği dolaylı yazmaç)
- SCTLR_EL1 (sistem denetim kaydı)
- CONTEXTIDR_EL1 (bağlam tanımlayıcısı)
Özel Durum ve Kesme İşleme , denetim özel durum davranışını kaydeder:
- VBAR_EL1 (vektör temel adres kaydı - özel durum vektör tablosu konumu)
- ESR_EL1 (özel durum sendromu kaydı)
- FAR_EL1 (hata adresi kaydı)
- AFSR0_EL1, AFSR1_EL1 (yardımcı hata durumu kayıtları)
Sistem Yapılandırması , denetim işlemcisi özelliklerini kaydeder:
- CPACR_EL1 (yardımcı işlemci erişim denetimi)
- ACTLR_EL1 (yardımcı kontrol kaydı)
- AMAIR_EL1 (yardımcı bellek özniteliği dolaylı yazmaç)
- ZCR_EL1, SMCR_EL1 (destekleniyorsa SVE/SME yapılandırması)
Hata ayıklama ve Performans İzleme yazmaçları VTL özeldir. Buna tüm hata ayıklama sistemi yazmaçları (MDSCR_EL1, DBGBCR_EL1[], DBGBVR_EL1[], DBGWCR_EL1[], DBGWVR_EL1[] vb.) ve tüm performans izleyicisi yazmaçları (PMCR_EL0 ve ilgili PMU kayıtları) dahildir
Süreölçer Yapılandırması kaydeder:
- CNTKCTL_EL1 (çekirdek zamanlayıcı denetimi)
- CNTV_CTL_EL0, CNTV_CVAL_EL0 (sanal zamanlayıcı denetimi ve karşılaştırma değeri)
İş Parçacığı Tanımlama kayıtları:
- TPIDR_EL0, TPIDR_EL1, TPIDRRO_EL0 (iş parçacığı kimliği kaydeder)
Yapay Hiper Yönetici Yazmaçları (doğrudan sistem kayıtlarında değil hiper çağrılar aracılığıyla erişilir):
- HvRegisterGuestOsId (konuk işletim sistemi kimliği)
- HvRegisterHypercallMsrValue (hiper çağrı arabirimi etkinleştirme)
- HvRegisterReferenceTsc (başvuru zaman damgası sayacı sayfası)
- HvRegisterVpAssistPage (bu VTL için VP yardım sayfası)
- Yapay kesme denetleyicisi yazmaçları (SynIC)
- Sentetik zamanlayıcı yazmaçları (Stimer0-3)
- Yerel kesme denetleyicisi arabirimi (GIC CPU arabirimi)
Bu kapsamlı VTL başına yazmaç yalıtımı, her VTL'nin diğer VTL'lerin müdahalesi olmadan yürütme ortamı, bellek yönetimi, özel durum işleme ve hiper yönetici arabirimi üzerinde tam denetime sahip olmasını sağlar.
Paylaşılan Durum
VTL geçişlerinin yükünü azaltmak ve güven düzeyleri arasında verimli iletişim sağlamak için VTL'ler belirli işlemci durumunu paylaşır. Paylaşılan durum, hesaplama ve veri geçişi, kayan nokta durumu ve güvenlik sınırlarını etkilemeyen belirli sistem durumu yazmaçları için kullanılan genel amaçlı yazmaçları içerir.
Genel amaçlı yazmaçları VTL'ler arasında paylaşarak, VTL çağrısı parametreleri doğrudan kayıtlara geçirebilir ve VTL dönüşü bellek tabanlı iletişim gerektirmeden sonuçları geri geçirebilir. Bu tasarım, özel durum tarafından sağlanan güvenlik yalıtımını korurken çapraz VTL çağrılarının performansını önemli ölçüde artırır.
x64 Platformlarında
x64 platformlarında paylaşılan durum, hesaplama için genel amaçlı yazmaçları, sistem bilgileri yazmaçlarını ve güvenlik yalıtımını etkilemeyen belirli durum yazmaçlarını içerir.
Paylaşılan MSR'ler , VTL'ler arasında ortak olan sistem bilgilerini ve yapılandırmayı sağlar:
- HV_X64_MSR_TSC_FREQUENCY
- HV_X64_MSR_VP_INDEX
- HV_X64_MSR_VP_RUNTIME
- HV_X64_MSR_RESET
- HV_X64_MSR_TIME_REF_COUNT
- HV_X64_MSR_GUEST_IDLE
- HV_X64_MSR_DEBUG_DEVICE_OPTIONS
- MTRR'ler
- MCG_CAP
- MCG_STATUS
Paylaşılan yazmaçlar , VTL'ler arasında verimli veri geçişi ve hesaplama sağlar:
- General-Purpose Yazmaçları: Rax, Rbx, Rcx, Rdx, Rsi, Rdi, Rbp, R8-R15 (VTL çağrıları sırasında hesaplama ve parametre geçişi için kullanılır)
- Özel Durum Bilgileri: CR2 (sayfa hatası doğrusal adresi - özel durum işleme bağlamı için paylaşılan)
- Hata Ayıklama Verileri: DR0-DR3 (hata ayıklama adresi yazmaçları - kesme noktası adresleri için kullanılır)
-
Floating-Point ve Vektör Durumu:
- X87 kayan nokta durumu (eski kayan nokta hesaplaması)
- XMM durumu (128 bit SSE vektörleri)
- AVX durumu (256 bit vektörler)
- XCR0/XFEM (genişletilmiş özellik maskeyi etkinleştir)
- Hata Ayıklama Durumu: DR6 (hata ayıklama durum kaydı - işlemci türüne bağımlı; paylaşılan veya özel olup olmadığını belirlemek için HvRegisterVsmCapabilities bölümünü okuyun)
ARM64 Platformlarında
ARM64 platformlarında paylaşılan durum hesaplama, veri geçirme ve kayan nokta işlemleri için kullanılan yazmaçları içerir. Bu paylaşım, parametrelerin ve sonuçların doğrudan yazmaçlara geçirilmesine izin vererek verimli VTL çağrılarına olanak tanır.
Paylaşılan yazmaçlar VTL'ler arasında hesaplama ve iletişim sağlar:
-
General-Purpose Yazmaçları: X0-X17, X19-X28 (hesaplama ve parametre geçirme için kullanılır)
- X0-X7 genellikle VTL çağrıları sırasında işlev parametreleri ve dönüş değerleri için kullanılır
- X8-X17, X19-X28 genel hesaplama için kullanılabilir
- Not: X18 (platform yazmaç) ve bilgisayar güvenlik nedeniyle VTL başına özeldir
- Not: X29 (FP/çerçeve işaretçisi), X30 (LR/bağlantı yazmacı) ve SP, VTL başına özeldir
-
Floating-Point ve Vektör Durumu:
- Q0-Q31 (vektör hesaplaması için 128 bit NEON/kayan nokta yazmaçları)
- Vektör işlemleri için gelişmiş SIMD (NEON) durumu
- Not: SVE durumu (Z0-Z31, P0-P15, FFR) ve SME durumu VTL özeldir. Alt 128 bit bölümü (Q yazmaçları) paylaşılır, ancak Z yazmaçlarının üst bitleri VTL geçişlerinde bozulabilir. Yazılım, VTL anahtarları arasında Z yazmaç içeriğinin korunmasına güvenmemelidir.
- Not: SPE (İstatistiksel Profil Oluşturma Uzantısı) durumu VTL özel olan PMBSR_EL1 dışında VTL'ler arasında paylaşılır
-
Sistem Bilgileri Yazmaçları (salt okunur veya güvenlik açısından kritik olmayan):
- Sistem tanımlama ve özellik yazmaçları
- Önbellek ve TLB tür bilgileri
ARM64, x64 ile aynı ilkeyi izler: genel hesaplama durumu verimlilik için paylaşılırken, güvenlik sınırlarını etkileyen denetim ve yapılandırma durumu her VTL için özel kalır.
Gerçek Mod (Yalnızca x64)
Gerçek mod, x64 platformlarında 0'dan büyük VTL'ler için desteklenmez. 0'dan büyük VTL'ler x64'te 32 bit veya 64 bit modunda çalıştırılabilir.
VTL Kesme Yönetimi
Sanal Güven Düzeyleri arasında yüksek düzeyde yalıtım elde etmek için Sanal Güvenli Mod, bir sanal işlemcide etkinleştirilen her VTL için ayrı bir kesme alt sistemi sağlar. Bu, bir VTL'nin daha az güvenli bir VTL'den müdahale olmadan kesmeleri hem gönderebilmesini hem de almasını sağlar.
Her VTL'nin kendi kesme denetleyicisi vardır ve bu denetleyici yalnızca sanal işlemci söz konusu VTL'de çalışıyorsa etkindir. Sanal işlemci VTL durumlarını değiştirirse, işlemcide etkin olan kesme denetleyicisi de değiştirilir.
x64 platformlarında her VTL'nin ayrı bir yerel APIC örneği vardır. ARM64 platformlarında her VTL ayrı bir GIC'ye sahiptir.
Etkin VTL'den daha yüksek bir VTL'yi hedefleyen bir kesme anında VTL anahtarına neden olur. Daha yüksek VTL daha sonra kesmeyi alabilir. Yüksek VTL, öncelik maskesi (x64 üzerinde TPR/CR8, ARM64'te GIC öncelik maskesi) nedeniyle kesmeyi alamıyorsa, kesme "beklemede" olarak tutulur ve VTL geçiş yapmaz. Bekleyen kesmeleri olan birden çok VTL varsa, en yüksek VTL önceliklidir (düşük VTL'ye bildirimde bulunmaksızın).
Bir kesme daha düşük bir VTL'ye hedeflendiğinde, sanal işlemci hedeflenen VTL'ye bir sonraki geçişine kadar kesme teslim edilmez.
x64 platformlarında, daha düşük bir VTL'yi hedefleyen INIT ve başlangıç IP'leri, daha yüksek VTL'nin etkinleştirildiği bir sanal işlemciye bırakılır. Mimari işlemci başlatma mekanizmaları engellenmiş olabileceğinden, işlemcileri başlatmak için HvCallStartVirtualProcessor hiper çağrı kullanılmalıdır.
ARM64 platformlarında, işlemcileri çevrimiçi hale getirmeye yönelik PSCI arabirim yöntemleri (CPU_ON gibi), daha yüksek bir VTL etkinleştirildiğinde benzer şekilde engellenir. HvCallStartVirtualProcessor hiper çağrı, işlemcileri başlatmak için tutarlı bir platformlar arası mekanizma sağlar.
Kesme Maskeleme ve VTL Anahtarları
x64 Platformlarında
VTL'leri değiştirmek için RFLAGS. IF, güvenli kesmenin bir VTL anahtarını tetikleyip tetiklemeyeceğini etkilemez. RFLAGS ise. Kesmeleri maskeleyecek şekilde temizlenirse, daha yüksek VTL'lere yapılan kesintiler yine de VTL'nin daha yüksek bir VTL'ye geçmesine neden olur. Yalnızca daha yüksek VTL'nin TPR/CR8 değeri, kesintiye uğrayıp kesilmeymeyeceğine karar verirken dikkate alınır.
Bu davranış, bir VTL dönüşünde bekleyen kesmeleri de etkiler. RFLAGS ise. Belirli bir VTL'deki kesmeleri maskeleyecek şekilde bit temizlenirse ve VTL (daha düşük bir VTL'ye) döndürürse, hiper yönetici bekleyen kesmeleri yeniden değerlendirir. Bu, daha yüksek VTL'ye hemen geri çağrı yapılmasına neden olur.
ARM64 Platformlarında
Benzer şekilde, PSTATE kesme maskesi bitleri (DAIF), güvenli kesmenin bir VTL anahtarını tetikleyip tetiklemeyeceğini etkilemez. Kesmeler PSTATE aracılığıyla maskelenirse, daha yüksek VTL'leri hedefleyen kesmeler yine de bir VTL anahtarına neden olur. Kesmenin hemen teslim edilip edilmeyeceğine karar verilirken yalnızca daha yüksek VTL'nin GIC öncelik maskesi dikkate alınır.
Sanal Kesme Bildirimi Yardımı
Aynı sanal işlemcinin daha düşük bir VTL'sine kesmenin anında teslimini engelliyorlarsa, daha yüksek VTL'ler bildirim almak üzere kaydolabilir. Daha yüksek VTL'ler, bir sanal kayıt HvRegisterVsmVina aracılığıyla Sanal Kesme Bildirim Yardımı'nı (VINA) etkinleştirebilir:
typedef union
{
UINT64 AsUINT64;
struct
{
UINT64 Vector : 8;
UINT64 Enabled : 1;
UINT64 AutoReset : 1;
UINT64 AutoEoi : 1;
UINT64 ReservedP : 53;
};
} HV_REGISTER_VSM_VINA;
Her VP'de her VTL'nin kendi VINA örneği ve kendi HvRegisterVsmVina sürümü vardır. ViNA tesisi, düşük VTL için bir kesme anında teslim için hazır olduğunda etkin olan daha yüksek VTL'ye uç ile tetiklenen bir kesme oluşturur.
Bu tesis etkinleştirildiğinde kesintilerin oluşmasını önlemek için VINA tesisi sınırlı bir durum içermektedir. Bir VINA kesintisi oluşturulduğunda, VINA tesisinin durumu "Onaylandı" olarak değiştirilir. VINA tesisiyle ilişkili SINT'e kesme sonu gönderilmesi "Onaylanan" durumu temizlemez. Onaylanan durum yalnızca iki yoldan biriyle temizlenebilir:
- Durum, HV_VP_VTL_CONTROL yapısının VinaAsserted alanına yazılarak el ile temizlenebilir.
- HvRegisterVsmVina kaydında "VTL girdisinde otomatik sıfırla" seçeneği etkinleştirilirse, VTL'ye bir sonraki girişte durum otomatik olarak temizlenir.
Bu, güvenli bir VTL'de çalışan kodun yalnızca daha düşük bir VTL için alınan ilk kesme hakkında bilgilendirilmesini sağlar. Güvenli bir VTL ek kesintiler hakkında bildirim almak isterse, yardımcı yardımcı sayfasının VinaAsserted alanını temizleyebilir ve bir sonraki yeni kesme hakkında bilgilendirilir.
Güvenli Kesme Çizgileri
Hiper yönetici, daha yüksek bir VTL'nin daha düşük bir VTL bağlamında gerçekleşen olaylar için kesme noktası yüklemesine olanak tanır. Bu, daha yüksek VTL'lere düşük VTL kaynakları üzerinde yükseltilmiş bir denetim düzeyi sağlar. Güvenli kesme çizgileri, sistem açısından kritik kaynakları korumak ve düşük VTL'lerden gelen saldırıları önlemek için kullanılabilir.
Güvenli bir kesme noktası daha yüksek VTL'ye kuyruğa alınır ve bu VTL, VP'de çalıştırılabilir hale getirilir.
Güvenli Kesme Noktası Türleri
| Kesme Noktası Türü | Kesme Noktası Uygulandığı Yer |
|---|---|
| Bellek erişimi | Daha yüksek bir VTL tarafından oluşturulan GPA korumalarına erişmeye çalışma. |
| Kayıt erişimini denetleme | Daha yüksek bir VTL tarafından belirtilen bir denetim yazmaç kümesine erişmeye çalışılıyor. |
İç İçe KesişimLer
Birden çok VTL daha düşük bir VTL'de aynı olay için güvenli kesme noktası yükleyebilir. Bu nedenle, iç içe yerleştirilmiş kesmelerin nereye bildirileceğine karar vermek için bir hiyerarşi oluşturulur. Aşağıdaki liste, kesme noktasının bildirildiği sıradır:
- Düşük VTL
- Daha yüksek VTL
Güvenli Kesme Yollarını İşleme
Bir VTL'ye güvenli bir kesme noktası bildirildikten sonra, düşük VTL'nin devam etmesi için işlem yapması gerekir. Daha yüksek VTL, kesme noktasını bir özel durum ekleme, erişimi öykünme veya erişime bir ara sunucu sağlama gibi çeşitli yollarla işleyebilir. Her durumda, düşük VTL VP'sinin özel durumunun değiştirilmesi gerekiyorsa HvCallSetVpRegisters kullanılmalıdır.
Güvenli Yazmaç KesmeLeri (Yalnızca x64)
x64 platformlarında, daha yüksek bir VTL belirli denetim kayıtlarına ve MSR'lere erişimleri kesebilir. Bu, HvCallSetVpRegisters hiper çağrısını kullanarak HvX64RegisterCrInterceptControl ayarlanarak elde edilir. HvX64RegisterCrInterceptControl'de denetim bitinin ayarlanması, ilgili denetim yazmaçlarının her erişimi için bir kesme noktası tetikler.
Bu özellik x64 denetim yazmaçlarını (CR0, CR4, XCR0) ve x64 MSR'leri (EFER, LSTAR, STAR vb.) kestiği için x64'e özgüdür. ARM64 platformları, farklı mekanizmalar aracılığıyla benzer kesme özelliklerini destekleyebilir.
typedef union
{
UINT64 AsUINT64;
struct
{
UINT64 Cr0Write : 1;
UINT64 Cr4Write : 1;
UINT64 XCr0Write : 1;
UINT64 IA32MiscEnableRead : 1;
UINT64 IA32MiscEnableWrite : 1;
UINT64 MsrLstarRead : 1;
UINT64 MsrLstarWrite : 1;
UINT64 MsrStarRead : 1;
UINT64 MsrStarWrite : 1;
UINT64 MsrCstarRead : 1;
UINT64 MsrCstarWrite : 1;
UINT64 ApicBaseMsrRead : 1;
UINT64 ApicBaseMsrWrite : 1;
UINT64 MsrEferRead : 1;
UINT64 MsrEferWrite : 1;
UINT64 GdtrWrite : 1;
UINT64 IdtrWrite : 1;
UINT64 LdtrWrite : 1;
UINT64 TrWrite : 1;
UINT64 MsrSysenterCsWrite : 1;
UINT64 MsrSysenterEipWrite : 1;
UINT64 MsrSysenterEspWrite : 1;
UINT64 MsrSfmaskWrite : 1;
UINT64 MsrTscAuxWrite : 1;
UINT64 MsrSgxLaunchControlWrite : 1;
UINT64 RsvdZ : 39;
};
} HV_REGISTER_CR_INTERCEPT_CONTROL;
Maske Yazmaçları
Daha ince denetime izin vermek için, denetim yazmaçlarının bir alt kümesine karşılık gelen maske yazmaçları da vardır. Maske yazmaçları, ilgili denetim yazmaçlarının bir alt kümesine kesme noktası yüklemek için kullanılabilir. Maske yazmaç tanımlanmadığı durumlarda, herhangi bir erişim (HvX64RegisterCrInterceptControl tarafından tanımlandığı gibi) bir kesme noktasını tetikler.
Hiper yönetici şu maske yazmaçlarını destekler: HvX64RegisterCrInterceptCr0Mask, HvX64RegisterCrInterceptCr4Mask ve HvX64RegisterCrInterceptIa32MiscEnableMask.
DMA ve Cihazlar
Cihazlar etkin bir şekilde VTL0 ile aynı ayrıcalık düzeyine sahiptir. VSM etkinleştirildiğinde, cihaz tarafından ayrılan tüm bellek VTL0 olarak işaretlenir. Tüm DMA erişimleri VTL0 ile aynı ayrıcalıklara sahiptir.