AVF mimarisi

Android, Android Sanallaştırma Çerçevesi'ni uygulamak için gereken tüm bileşenlerin referans uygulamasını sağlar. Şu anda bu uygulama ARM64 ile sınırlıdır. Bu sayfada çerçeve mimarisi açıklanmaktadır.

Arka plan

Arm mimarisinde en az ayrıcalıklı olan 0 istisna düzeyi (EL0) ve en ayrıcalıklı olan 3 istisna düzeyi (EL3) olmak üzere en fazla dört istisna düzeyi kullanılabilir. Android kod tabanının en büyük kısmı (tüm kullanıcı alanı bileşenleri) EL0'da çalışır. Genellikle "Android" olarak adlandırılan diğer kısım, EL1'de çalışan Linux çekirdeğidir.

EL2 katmanı, güçlü gizlilik ve bütünlük garantileriyle EL1/EL0'da bellek ve cihazları ayrı pVM'lere ayırmayı sağlayan bir hipervizörün kullanılmasına olanak tanır.

Hipervizör

Korunan çekirdek tabanlı sanal makine (pKVM), Linux KVM hipervizörü üzerine kurulmuştur. Bu sanal makine, oluşturma sırasında "korumalı" olarak işaretlenen konuk sanal makinelerdeki yüklere erişimi kısıtlama özelliğiyle genişletilmiştir.

KVM/arm64, belirli CPU özelliklerinin (ör. sanallaştırma ana makine uzantıları (VHE) (ARMv8.1 ve sonraki sürümler)) kullanılabilirliğine bağlı olarak farklı yürütme modlarını destekler. Genellikle VHE dışı mod olarak bilinen bu modlardan birinde, hipervizör kodu önyükleme sırasında çekirdek görüntüsünden ayrılır ve EL2'ye yüklenir. Çekirdeğin kendisi ise EL1'de çalışır. Linux kod tabanının bir parçası olsa da KVM'nin EL2 bileşeni, birden fazla EL1 arasındaki anahtardan sorumlu küçük bir bileşendir. Hipervizör bileşeni Linux ile derlenir, ancak vmlinux görüntüsünün ayrı ve özel bir bellek bölümünde yer alır. pKVM, hipervizör kodunu yeni özelliklerle genişleterek Android ana makine çekirdeği ile kullanıcı alanına kısıtlamalar getirerek ve ana makine erişimini konuk belleğine ve hipervizöre sınırlayarak bu tasarımdan yararlanır.

pKVM tedarikçi firma modülleri

pKVM tedarikçi modülü, giriş/çıkış bellek yönetim birimi (IOMMU) sürücüleri gibi cihaza özgü işlevler içeren donanıma özgü bir modüldür. Bu modüller, istisna düzeyi 2 (EL2) erişimi gerektiren güvenlik özelliklerini pKVM'ye taşımanıza olanak tanır.

pKVM tedarikçi modülünü nasıl uygulayacağınızı ve yükleyeceğinizi öğrenmek için pKVM tedarikçi modülü uygulama başlıklı makaleyi inceleyin.

Başlatma prosedürü

Aşağıdaki şekilde pKVM önyükleme prosedürü gösterilmektedir:

pKVM önyükleme prosedürü

Şekil 1. pKVM önyükleme prosedürü

  1. Önyükleme programı, EL2'de genel çekirdeğe girer.
  2. Genel çekirdek, EL2'de çalıştığını algılar ve kendisini EL1'e devre dışı bırakırken pKVM ve modülleri EL2'de çalışmaya devam eder. Ayrıca, pKVM tedarikçi firma modülleri de bu sırada yüklenir.
  3. Genel çekirdek, kullanıcı alanına ulaşana kadar gerekli tüm cihaz sürücülerini yükleyerek normal şekilde önyükleme işlemine devam eder. Bu noktada pKVM kullanıma girmiş ve 2. aşama sayfa tablolarını yönetmektedir.

Başlatma prosedürü, çekirdek resminin bütünlüğünü yalnızca erken başlatma sırasında korumak için önyükleyiciye güvenir. Çekirdek ayrıcalığı kaldırıldığında artık hipervizör tarafından güvenilmez. Bu çekirdek, çekirdek güvenliği ihlal edilse bile kendini korumaktan sorumludur.

Android çekirdeği ve hipervizörün aynı ikili program görüntüsünde olması, aralarında çok sıkı bir şekilde bağlı bir iletişim arayüzü sağlar. Bu sıkı bağlantı, iki bileşenin atomik güncellemelerini garanti eder. Bu sayede, aralarındaki arayüzün kararlı tutulması gerekmez ve uzun vadeli sürdürülebilirlikten ödün vermeden çok fazla esneklik sağlanır. Bu sıkı bağlantı, hipervizör tarafından sağlanan güvenlik garantilerini etkilemeden her iki bileşenin de birlikte çalışabildiği durumlarda performans optimizasyonlarına da olanak tanır.

Ayrıca, GKI'nin Android ekosisteminde benimsenmesi, pKVM hipervizörünün çekirdekle aynı ikili dosyada Android cihazlara otomatik olarak dağıtılmasına olanak tanır.

CPU bellek erişimi koruması

Arm mimarisi, iki bağımsız aşamaya bölünmüş bir bellek yönetim birimi (MMU) belirtir. Bu aşamaların her ikisi de adres çevirisi ve belleğin farklı bölümlerine erişim denetimi uygulamak için kullanılabilir. 1. Aşama MMU, EL1 tarafından kontrol edilir ve birinci düzey adres çevirisi sağlar. 1. aşama MMU, her kullanıcı alanı işlemine ve kendi sanal adres alanına sağlanan sanal adres alanını yönetmek için Linux tarafından kullanılır.

2. aşamadaki MMU, EL2 tarafından kontrol edilir ve 1. aşamadaki MMU'nun çıkış adresine ikinci bir adres çevirisi uygulanmasını sağlar. Bu sayede fiziksel bir adres (PA) elde edilir. 2. aşama çeviri, hipervizörler tarafından tüm konuk sanal makinelerden bellek erişimlerini kontrol etmek ve çevirmek için kullanılabilir. Şekil 2'de gösterildiği gibi, çevirinin her iki aşaması da etkinleştirildiğinde 1. aşamanın çıkış adresi ara fiziksel adres (IPA) olarak adlandırılır. Not: Sanal adres (VA), IPA'ya ve ardından PA'ya çevrilir.

CPU bellek erişimi koruması

Şekil 2. CPU bellek erişimi koruması

Geçmişte KVM, konukları çalıştırırken 2. aşama çevirinin etkin olduğu ve ana makinenin Linux çekirdeğini çalıştırırken 2. aşama devre dışı bırakılarak çalışır. Bu mimari, ana makine 1 MMU'dan bellek erişimlerinin 2. aşamadaki MMU'dan geçmesine olanak tanıyarak ana makineden konuk bellek sayfalarına sınırsız erişime olanak tanır. Öte yandan pKVM, ana makine bağlamında bile 2. aşama koruması sağlar ve hipervizöre, ana makine yerine konuk belleği sayfalarını korumaktan sorumlu olur.

KVM, konuklar için karmaşık IPA/PA eşlemelerini uygulamak amacıyla 2. aşamada adres çevirisinden tam olarak yararlanır. Bu da fiziksel parçalanmaya rağmen konuklar için bitişik bellek yanılsaması oluşturur. Ancak, ana makine için 2. aşama MMU'nun kullanımı yalnızca erişim denetimiyle sınırlıdır. 2. ana makine aşaması, kimlik eşlendiğinden, ana makine IPA alanındaki bitişik belleğin PA alanında bitişik olmasını sağlar. Bu mimari, sayfa tablosunda büyük eşlemelerin kullanılmasına olanak tanır ve sonuç olarak çeviri yedek tamponu (TLB) üzerindeki baskıyı azaltır. Bir kimlik eşleme PA tarafından dizine eklenebileceğinden, ana makine aşama 2, sayfa sahipliğini doğrudan sayfa tablosunda izlemek için de kullanılır.

Doğrudan bellek erişimi (DMA) koruması

Daha önce açıklandığı gibi, CPU sayfa tablolarında Linux ana makinesinden konuk sayfalarının eşlemesini kaldırmak, konuk belleğini korumak için gerekli ancak yetersiz bir adımdır. pKVM, ana makine çekirdeğinin kontrolü altındaki DMA özellikli cihazların bellek erişimlerine ve kötü amaçlı bir ana makine tarafından başlatılan DMA saldırısı olasılığına karşı da koruma sağlaması gerekir. pKVM, bu tür bir cihazın misafir belleğine erişmesini engellemek amacıyla Şekil 3'te gösterildiği gibi sistemdeki DMA özellikli her cihaz için giriş-çıkış bellek yönetim birimi (IOMMU) donanımı gerektirir.

Dma bellek erişimi koruması

Şekil 3. DMA bellek erişim koruması

IOMMU donanımı, en azından bir cihazın fiziksel belleğe sayfa ayrıntı düzeyinde okuma/yazma erişimini verme ve iptal etme olanağı sağlar. Ancak bu IOMMU donanımı, kimlik eşlenmiş 2. aşamayı varsaydığı için cihazların pVM'lerde kullanımını sınırlar.

Sanal makineler arasında yalıtım sağlamak için farklı varlıklar adına oluşturulan bellek işlemlerinin IOMMU tarafından ayırt edilebilir olması gerekir. Böylece, çeviri için uygun sayfa tablosu grubu kullanılabilir.

Ayrıca, EL2'de SoC'ye özgü kod miktarını azaltmak, pKVM'nin genel güvenilir bilgi işlem tabanını (TCB) azaltmak için önemli bir stratejidir ve IOMMU sürücülerinin hipervizöre dahil edilmesine aykırıdır. Bu sorunu azaltmak için EL1'deki ana makine, güç yönetimi, başlatma ve uygun durumlarda kesinti işleme gibi yardımcı IOMMU yönetim görevlerinden sorumludur.

Ancak ana makineyi cihaz durumunun kontrolüne vermek, izin kontrollerinin başka yöntemlerle (ör. cihaz sıfırlandıktan sonra) atlanamaması için IOMMU donanımının programlama arayüzüne ek koşullar getirir.

Arm cihazları için hem yalıtımı hem de doğrudan atamayı mümkün kılan standart ve iyi desteklenen bir IOMMU, Arm Sistemi Bellek Yönetim Birimi (SMMU) mimarisidir. Bu mimari, önerilen referans çözümdür.

Bellek sahipliği

Başlatma sırasında, hipervizör olmayan tüm belleğin ana makineye ait olduğu varsayılır ve bu şekilde hipervizör tarafından izlenir. Bir sanal makine oluşturulduğunda ana makine, önyüklemesine izin vermek için bellek sayfaları bağışlar ve hipervizör bu sayfaların sahipliğini ana makineden sanal makineye aktarır. Bu nedenle hipervizör, ana makinenin 2. aşama sayfa tablosunda sayfalara tekrar erişmesini engellemek için erişim denetimi kısıtlamaları uygulayarak konuk için gizlilik sağlar.

Ana makine ile konuklar arasındaki iletişim, aralarında kontrollü bellek paylaşımı yapılarak sağlanır. Konukların, hiper çağrı kullanarak sayfalarının bir kısmını ana makineyle paylaşmasına izin verilir. Hiper çağrı, hipervizöre bu sayfaları ana makine 2. aşama sayfa tablosunda yeniden eşlemesini talimatlandırır. Benzer şekilde, ana makinenin TrustZone ile iletişimi, bellek paylaşımı ve/veya ödünç verme işlemleriyle mümkün olur. Bu işlemlerin tümü, Arm için Donanım Yazılımı Çerçevesi (FF-A) spesifikasyonu kullanılarak pKVM tarafından yakından izlenir ve kontrol edilir.

Bir pVM'nin bellek gereksinimleri zaman içinde değişebileceğinden, arayana ait belirli sayfaların sahipliğinin ana makineye geri bırakılmasına olanak tanıyan bir hiper çağrı sağlanır. Pratikte bu hiperçağrı, VMM'nin pVM'den bellek istemesine ve pVM'nin, kontrollü bir şekilde VMM'yi bırakılan sayfalar hakkında bilgilendirmesine olanak tanımak için virtio balon protokolüyle birlikte kullanılır.

Hipervizör, sistemdeki tüm bellek sayfalarının sahipliğini ve bunların başka varlıklara paylaşılıp paylaşılmadığını veya başka varlıklara aktarılıp aktarılmadığını izlemekten sorumludur. Bu durum izleme işleminin çoğu, ana makine ve konukların 2. aşama sayfa tablolarına eklenen meta veriler kullanılarak yapılır. Bu işlem, adından da anlaşılacağı gibi yazılım kullanımı için ayrılmış sayfa tablosu girişlerindeki (PTE'ler) ayrılmış bitler kullanılarak yapılır.

Ana makine, hipervizör tarafından erişilemez hale getirilen sayfalara erişmeye çalışmamalıdır. Yasa dışı ana makine erişimi, hipervizör tarafından ana makineye eşzamanlı istisnanın eklenmesine neden olur. Bu durum, sorumlu kullanıcı alanı görevinin bir SEGV sinyali almasına veya ana makine çekirdeğinin kilitlenmesine yol açabilir. Yanlışlıkla erişimi önlemek için konuklara bağışlanan sayfalar, ana makine çekirdeği tarafından takas veya birleştirme için uygun hale getirilmez.

İşlemeyi ve zamanlayıcıları kesme

Kesintiler, konukların cihazlarla etkileşim şeklinin ve ana iletişim mekanizmasının işlemci içi kesintiler (IPI'ler) olduğu CPU'lar arasındaki iletişimin önemli bir parçasıdır. KVM modelinde, tüm sanal kesinti yönetimi EL1'deki ana makineye devredilir. Bu amaçla, ana makine hiper yöneticinin güvenilmeyen bir parçası gibi davranır.

pKVM, mevcut KVM koduna dayalı tam bir Genel Kesme Denetleyicisi sürüm 3 (GICv3) emülasyonu sunar. Zamanlayıcı ve IPI'ler, bu güvenilmeyen emülasyon kodunun bir parçası olarak işlenir.

GICv3 desteği

EL1 ile EL2 arasındaki arayüz, kesintilerle ilgili hipervizör kayıtlarının kopyaları da dahil olmak üzere kesinti durumunun tamamının EL1 ana makinesine gösterilmesini sağlamalıdır. Bu görünürlük genellikle, sanal CPU (vCPU) başına bir tane olacak şekilde paylaşılan bellek bölgeleri kullanılarak gerçekleştirilir.

Sistem kaydedicisi çalışma zamanı destek kodu, yalnızca Yazılım Tarafından Oluşturulan Kesme Kaydedicisi (SGIR) ve Kesme Kaydedicisini Devre Dışı Bırakma (DIR) kaydedicisi tuzağını destekleyecek şekilde basitleştirilebilir. Mimari, bu kayıtların her zaman EL2'ye takılmasını zorunlu kılarken diğer tuzaklar şimdiye kadar yalnızca hataları azaltmak için yararlı olmuştur. Bunun dışında her şey donanımla yapılıyor.

MMIO tarafında her şey EL1'de taklit edilir ve KVM'deki mevcut tüm altyapı yeniden kullanılır. Son olarak, KVM'nin kullandığı temel planlama ilkellerinden biri olduğu için kesintiyi bekle (WFI) her zaman EL1'e iletilir.

Zamanlayıcı desteği

Sanal zamanlayıcının karşılaştırıcı değeri, EL1'in vCPU engellenirken zamanlayıcı kesintileri enjekte edebilmesi için her tuzak WFI'de EL1'e gösterilmelidir. Fiziksel zamanlayıcı tamamen emülasyonludur ve tüm tuzaklar EL1'e aktarılır.

MMIO işleme

Sanal makine izleyiciyle (VMM) iletişim kurmak ve GIC emülasyonu gerçekleştirmek için daha ayrıntılı bir inceleme yapılması amacıyla MMIO tuzaklarının EL1'deki ana makineye geri aktarılması gerekir. pKVM için aşağıdakiler gereklidir:

  • IPA ve erişimin boyutu
  • Yazma durumunda veriler
  • Sıkıştırma noktasında CPU'nun bitiş noktası

Ayrıca, kaynak/hedef olarak genel amaçlı bir kaydedici (GPR) içeren tuzaklar, soyut bir aktarım sözde kaydedicisi kullanılarak aktarılır.

Davetli arayüzleri

Bir konuk, hiper çağrıları ve kilitli bölgelere hafıza erişimini kullanarak korumalı bir konukla iletişim kurabilir. Hiper çağrılar, KVM tarafından tedarikçi firma tahsisi için ayrılmış bir aralıkla SMCCC standardına göre gösterilir. Aşağıdaki hiper çağrılar, pKVM konukları için özellikle önemlidir.

Genel hiper çağrılar

  • PSCI, misafirin vCPU'larının çevrimiçi olma, çevrimdışı olma ve sistem kapatma gibi yaşam döngüsünü kontrol etmesi için standart bir mekanizma sağlar.
  • TRNG, misafirin pKVM'den entropi istemesi için standart bir mekanizma sağlar. Bu mekanizma, çağrıyı EL3'e iletir. Bu mekanizma, özellikle ana makinenin donanım rastgele sayı oluşturucuyu (RNG) sanallaştırması için güvenilir olmadığı durumlarda yararlıdır.

pKVM hiper çağrıları

  • Ana makineyle anı paylaşımı. Ana makine, başlangıçta tüm konuk belleğine erişemez ancak paylaşılan bellek iletişimi ve paylaşılan arabelleklere dayanan para-sanallaştırılmış cihazlar için ana makine erişimi gereklidir. Sayfaları ana makineyle paylaşma ve paylaşmamayı kaldırma için kullanılan hiper çağrılar, konuğun el sıkışma işlemine gerek kalmadan belleğin tam olarak hangi bölümlerinin Android'in geri kalanına erişilebilir hale getirileceğine karar vermesine olanak tanır.
  • Barındırıcıya bellek bırakma. Tüm konuk bellekleri, silinene kadar genellikle konuğa aittir. Bu durum, zaman içinde değişen bellek gereksinimleri olan uzun ömürlü sanal makineler için yetersiz olabilir. relinquish hiperçağrısı, konuğun oturumunu kapatmadan sayfaların sahipliğini açıkça ana makineye aktarmasına olanak tanır.
  • Ana makineye bellek erişimi tuzağı. Geleneksel olarak, bir KVM misafiri geçerli bir bellek bölgesine karşılık gelmeyen bir adrese erişirse vCPU iş parçacığı ana makineden çıkar ve erişim genellikle MMIO için kullanılır ve kullanıcı alanında VMM tarafından emüle edilir. Bu işleme sürecini kolaylaştırmak için pKVM'nin adres, parametreleri ve potansiyel olarak içeriklerini ana makineye geri döndürmesi gibi hatalı bilgiyle ilgili ayrıntıları tanıtması gerekir. Bu da tuzak beklenmiyorsa koruma altındaki bir konuğa ait hassas verileri yanlışlıkla açığa çıkarabilir. pKVM, önceden bir ana makinenin geri çağrılmasına izin verilen IP-aramının IP-arası tarafından geçersiz kılınan IP erişim hatasını geçersiz olarak değerlendirerek bu sorunu çözer. Bu çözüm MMIO koruması olarak adlandırılır.

Sanal G/Ç cihazı (virtio)

Virtio, paravirtüel cihazların uygulanması ve bunlarla etkileşim kurulması için popüler, taşınabilir ve olgunlaşmış bir standarttır. Korunan konuklara sunulan cihazların çoğu virtio kullanılarak uygulanır. Virtio, korunan bir konuk ile Android'in geri kalanı arasındaki iletişim için kullanılan vsock uygulamasının da temelini oluşturur.

Virtio cihazlar genellikle ana makinenin kullanıcı alanında VMM tarafından uygulanır. VMM, konuktan virtio cihazın MMIO arayüzüne gelen ve yakalanan bellek erişimlerini durdurur ve beklenen davranışı taklit eder. Cihaza her erişim için VMM'ye gidip gelmek zorunda olduğundan MMIO erişimi nispeten pahalıdır. Bu nedenle, cihaz ile misafir arasındaki gerçek veri aktarımının çoğu, bellekteki bir dizi sanal makine kullanılarak gerçekleştirilir. Virtio'nun temel varsayımlarından biri, ana makinenin konuk belleğine rastgele erişebildiğidir. Bu varsayım, virtqueue'un tasarımında açıkça görülebilir. Bu tasarımda, cihaz emülasyonunun doğrudan erişmesi amaçlanan misafirdeki arabelleğe işaretçiler bulunabilir.

Daha önce açıklanan bellek paylaşımı hiper çağrıları, konuktan ana makineyle sanal makine arabelleklerini paylaşmak için kullanılabilir ancak bu paylaşım, sayfa ayrıntı düzeyinde gerçekleştirilir ve arabellek boyutu bir sayfanınkinden küçük olursa gerekenden daha fazla veri açığa çıkabilir. Bunun yerine konuk, hem sanal sıraları hem de ilgili veri arabelleklerini sabit bir paylaşılan bellek aralığında olacak şekilde yapılandırılır. Veriler gerektiğinde pencereye ve pencereden kopyalanır (atlanır).

Sanal cihaz

Şekil 4. Virtio cihaz

TrustZone ile etkileşim

Davetliler TrustZone ile doğrudan etkileşim kuramaz ancak ev sahibi, güvenli dünyaya SMC çağrıları göndermeye devam edebilmelidir. Bu çağrılar, ana makinanın erişemediği fiziksel olarak adreslenmiş bellek arabelleklerini belirtebilir. Güvenli yazılım genellikle arabelleğin erişilebilirliğinden haberdar olmadığı için kötü amaçlı bir ana makine, karışık bir yardımcı saldırısı gerçekleştirmek (DMA saldırısına benzer) için bu arabelleği kullanabilir. pKVM, bu tür saldırıları önlemek için tüm ana makine SMC çağrılarını EL2'ye yönlendirir ve ana makine ile EL3'teki güvenli monitör arasında proxy görevi görür.

Ana makineden gelen PSCI çağrıları, minimum değişiklikle EL3 donanım yazılımına yönlendirilir. Özellikle, internete bağlanan veya askıya alma durumundan devam eden bir CPU'nun giriş noktası yeniden yazılır. Böylece 2. aşama sayfa tablosu, EL1'deki ana makineye dönmeden önce EL2'ye yüklenir. Bu koruma, önyükleme sırasında pKVM tarafından uygulanır.

Bu mimari, tercihen EL3 donanım yazılımı olarak TF-A'nın güncel bir sürümünün kullanılmasıyla PSCI'yi destekleyen SoC'ye dayanır.

Arm için Donanım Yazılımı Çerçevesi (FF-A), özellikle güvenli bir hipervizör varken normal ve güvenli dünyalar arasındaki etkileşimleri standart hale getirir. Spesifikasyonun önemli bir bölümü, hem ortak bir mesaj biçimi hem de altta yatan sayfalar için iyi tanımlanmış bir izin modeli kullanan belleği güvenli dünyayla paylaşmaya yönelik bir mekanizma tanımlar. Ana makinenin, yeterli izinlere sahip olmadığı güvenli tarafla belleği paylaşmaya çalışmamasını sağlayan pKVM proxy'leri FF-A mesajları.

Bu mimari, bellek erişim modelini zorunlu kılan güvenli dünya yazılımına dayanır. Böylece güvenilir uygulamaların ve güvenli dünyada çalışan diğer tüm yazılımların, yalnızca güvenli dünyaya ait olması veya FF-A kullanılarak açıkça paylaşılmış olması durumunda belleğe erişebilmesini sağlar. S-EL2'ye sahip bir sistemde, bellek erişim modelinin zorunlu kılınması, güvenli dünya için 2. aşama sayfa tablolarını koruyan Hafnium gibi bir Güvenli Bölme Yöneticisi Çekirdeği (SPMC) tarafından yapılmalıdır. S-EL2 bulunmayan bir sistemde TEE, 1. aşama sayfa tabloları aracılığıyla bellek erişim modelini zorunlu kılabilir.

EL2'ye yapılan SMC çağrısı bir PSCI çağrısı veya FF-A tanımlı bir mesaj değilse işlenmemiş SMC'ler EL3'e yönlendirilir. Varsayılan olarak, güvenli donanım yazılımı (mutlaka güvenilir), pVM izolasyonunu korumak için gereken önlemleri anladığından, işlenmemiş SMC'leri güvenli bir şekilde işleyebilir.

Sanal makine izleyici

crosvm, Linux'un KVM arayüzü üzerinden sanal makineleri çalıştıran bir sanal makine izleyicisidir (VMM). crosvm'i benzersiz kılan, Rust programlama dilini kullanarak güvenliği ön planda tutması ve ana makine çekirdeğini korumak için sanal cihazların etrafında bir korumalı alan oluşturmasıdır. Crosvm hakkında daha fazla bilgi için burada bulunan resmi dokümanları inceleyin.

Dosya tanımlayıcılar ve ioctl'lar

KVM, KVM API'sini oluşturan ioctl'larla /dev/kvm karakter cihazını kullanıcı alanına gösterir. ioctl'lar aşağıdaki kategorilere ayrılır:

  • Sistem ioctl'ları, KVM alt sisteminin tamamını etkileyen global özellikleri sorgulayarak ayarlar ve pVM oluşturur.
  • VM ioctl'leri, sanal CPU'lar (vCPU'lar) ve cihazlar oluşturan ve pVM'nin tamamını etkileyen özellikleri sorgulayarak ayarlar (ör. bellek düzeni ve sanal CPU (vCPU) ve cihaz sayısı).
  • vCPU ioctl'ları, tek bir sanal CPU'nun çalışmasını kontrol eden özellikleri sorgulayarak ayarlar.
  • Cihaz ioctl'leri, tek bir sanal cihazın çalışmasını kontrol eden özellikleri sorgular ve ayarlar.

Her crosvm işlemi, bir sanal makinenin tam olarak bir örneğini çalıştırır. Bu işlem, pVM ioctl'ları yayınlamak için kullanılabilecek bir VM dosya tanımlayıcısı oluşturmak üzere KVM_CREATE_VM sistem ioctl'unu kullanır. Bir sanal makine FD'sinde KVM_CREATE_VCPU veya KVM_CREATE_DEVICE ioctl'u bir vCPU/cihaz oluşturur ve yeni kaynağı işaret eden bir dosya tanımlayıcısı döndürür. Bir vCPU veya cihaz FD'sindeki ioctl'lar, bir sanal makine FD'sinde ioctl kullanılarak oluşturulan cihazı kontrol etmek için kullanılabilir. vCPU'lar için bu, konuk kodunu çalıştırma gibi önemli bir görevi içerir.

crosvm, dahili olarak kenar tetiklemeli epoll arayüzünü kullanarak sanal makinenin dosya tanımlayıcılarını çekirdeğe kaydeder. Daha sonra çekirdek, dosya tanımlayıcılarının herhangi birinde bekleyen yeni bir etkinlik olduğunda crosvm'yi bilgilendirir.

pKVM, pVM ortamı hakkında bilgi almak ve sanal makine için korumalı modu ayarlamak amacıyla kullanılabilecek yeni bir özellik (KVM_CAP_ARM_PROTECTED_VM) ekler. --protected-vm işareti geçildiğinde crosvm, pVM oluşturma sırasında bu özelliği kullanarak pVM donanım yazılımı için uygun miktarda belleği sorgulayıp ayırır ve ardından korumalı modu etkinleştirir.

Bellek ayırma

VMM'nin temel sorumluluklarından biri, sanal makinenin belleğini ayırmak ve bellek düzenini yönetmektir. crosvm, aşağıdaki tabloda kabaca açıklanan sabit bir bellek düzeni oluşturur.

Normal modda FDT PHYS_MEMORY_END - 0x200000
Yer aç ...
Ramdisk ALIGN_UP(KERNEL_END, 0x1000000)
Çekirdek 0x80080000
Önyükleyici 0x80200000
BIOS modunda FDT 0x80000000
Fiziksel bellek tabanı 0x80000000
pVM donanım yazılımı 0x7FE00000
Cihaz belleği 0x10000 - 0x40000000

Fiziksel bellek mmap ile ayrılır ve bellek memslots adlı bellek bölgelerini KVM_SET_USER_MEMORY_REGION ioctl ile doldurmak için sanal makineye bağışlanır. Bu nedenle, tüm konuk pVM belleği, onu yöneten crosvm örneğine bağlanır ve ana makinede boş bellek bitmeye başlarsa işlemin sonlandırılmasına (sanal makinenin sonlandırılmasına) neden olabilir. Bir sanal makine durdurulduğunda bellek, hipervizör tarafından otomatik olarak silinir ve ana makine çekirdeğine döndürülür.

Normal KVM altında VMM, tüm konuk belleğine erişimi korur. pKVM ile, konuğa bağışlandığında konuk belleğinin ana makinenin fiziksel adres alanındaki eşlemesi kaldırılır. Tek istisna, konuk tarafından açıkça paylaşılan bellektir (ör. virtio cihazları).

Misafirin adres alanındaki MMIO bölgeleri eşlenmemiş olarak bırakılır. Misafirin bu bölgelere erişimi engellenir ve sanal makine FD'sinde bir G/Ç etkinliği oluşur. Bu mekanizma, sanal cihazları uygulamak için kullanılır. Korunan modda, konuk, yanlışlıkla bilgi sızıntısı riskini azaltmak için adres alanının bir bölgesinin MMIO için kullanıldığını hiper çağrı kullanarak kabul etmelidir.

Planlama

Her sanal CPU, bir POSIX iş parçacığı ile temsil edilir ve ana makine Linux planlayıcısı tarafından planlanır. İş parçacığı, vCPU FD'sinde KVM_RUN ioctl'u çağırır. Bu, hipervizörün misafir vCPU bağlamına geçmesine neden olur. Ana makine planlayıcısı, misafir bağlamında harcanan süreyi ilgili vCPU iş parçacığı tarafından kullanılan süre olarak hesaba katar. KVM_RUN, VMM tarafından işlenmesi gereken bir etkinlik (G/Ç, kesme sonu veya vCPU durdurulması gibi) olduğunda döndürülür. VMM, etkinliği işler ve KVM_RUN'ü tekrar çağırır.

KVM_RUN sırasında, EL2 hipervizör kodunun yürütülmesi hariç olmak üzere iş parçacığı ana makine planlayıcısı tarafından kesintiye uğratılabilir durumda kalır. Konuk pVM'nin kendisinin bu davranışı kontrol edecek bir mekanizması yoktur.

Tüm vCPU iş parçacıkları diğer kullanıcı alanı görevleri gibi planlandığından tüm standart kalite düzeyi mekanizmalarına tabidir. Daha açık belirtmek gerekirse, her vCPU iş parçacığı fiziksel CPU'lara uyumlu hale getirilebilir, cpuset'lere yerleştirilebilir, kullanım sınırlama kullanılarak artırılabilir veya sınırlanabilir, öncelik/planlama politikası değiştirilebilir ve daha fazlası yapılabilir.

Sanal cihazlar

crosvm, aşağıdakiler de dahil olmak üzere çeşitli cihazları destekler:

  • Kompozit disk görüntüleri için virtio-blk, salt okuma veya okuma/yazma
  • Ana makineyle iletişim için vhost-vsock
  • Virtio taşıma olarak virtio-pci
  • pl030 gerçek zamanlı saat (RTC)
  • Seri iletişim için 16550a UART

pVM donanım yazılımı

pVM donanım yazılımı (pvmfw), fiziksel bir cihazın önyükleme ROM'una benzer şekilde, pVM tarafından yürütülen ilk koddur. pvmfw'nin birincil amacı, güvenli önyüklemeyi başlatmak ve pVM'nin benzersiz sırrını türetmektir. pvmfw, işletim sistemi crosvm tarafından desteklenip düzgün bir şekilde imzalandığı sürece Microdroid gibi belirli bir işletim sistemiyle sınırlı değildir.

pvmfw ikili dosyası, aynı ada sahip bir flash bölümde depolanır ve OTA kullanılarak güncellenir.

Cihazın başlatılması

pKVM özellikli bir cihazın önyükleme işlemine aşağıdaki adım dizisi eklenir:

  1. Android Önyükleyici (ABL), pvmfw'yi bölümünden belleğe yükler ve resmi doğrular.
  2. ABL, Device Identifier Composition Engine (DICE) gizli bilgilerini (Compound Device Identifiers (CDIs) ve DICE sertifika zinciri) bir Güven Kökü'nden alır.
  3. ABL, pvmfw için gerekli CD'leri türeterek pvmfw ikilisine ekler.
  4. ABL, DT'ye linux,pkvm-guest-firmware-memory ayrılmış bellek bölgesi düğümü ekler. Bu düğüm, pvmfw ikili dosyasının konumunu ve boyutunu ve önceki adımda türettiği gizli anahtarları açıklar.
  5. ABL, kontrolü Linux'a verir ve Linux, pKVM'yi başlatır.
  6. pKVM, pvmfw bellek bölgesinin ana makinenin 2. aşama sayfa tablolarıyla eşlemesini kaldırır ve cihazın çalışma süresi boyunca ana makineden (ve konuklardan) korur.

Cihaz açıldıktan sonra Microdroid, Microdroid belgesinin Açılış sırası bölümündeki adımlara göre açılır.

pVM önyüklemesi

Bir pVM oluşturulurken crosvm (veya başka bir VMM), hipervizör tarafından pvmfw görüntüsüyle doldurulacak kadar büyük bir memslot oluşturmalıdır. VMM, ilk değerini ayarlayabileceği kaydedici listesinde de kısıtlanır (birincil vCPU için x0-x14, ikincil vCPU'lar için hiçbiri). Kalan kaydediciler ayrılmıştır ve hypervisor-pvmfw ABI'nin bir parçasıdır.

pVM çalıştırıldığında hipervizör ilk olarak birincil vCPU'yu pvmfw üzerinde kontrol eder. Donanım yazılımı, crosvm'in bilinen ofsetlerde belleğe bir AVB imzalı çekirdek (açılış yükleyici veya başka bir resim olabilir) ve imzasız bir FDT yüklemesini bekler. pvmfw, AVB imzasını doğrular ve başarılı olursa alınan FDT'den güvenilir bir cihaz ağacı oluşturur, gizli bilgilerini bellekten siler ve yükü giriş noktasına yönlendirir. Doğrulama adımlarından biri başarısız olursa donanım yazılımı bir PSCI SYSTEM_RESET hiper çağrısı gönderir.

Yeniden başlatmalar arasında, pVM örneğiyle ilgili bilgiler bir bölümde (virtio-blk cihazı) saklanır ve yeniden başlatmanın ardından gizli anahtarın doğru örneğe sağlanmasını sağlamak için pvmfw'nin gizli anahtarıyla şifrelenir.