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 mimarisi, en fazla dört istisna seviyesine olanak tanır. İstisna düzeyi 0 (EL0) en az ayrıcalıklı, istisna düzeyi 3 (EL3) ise en yüksek ayrıcalık seviyesidir. 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 içeriklerin geri kalanı ise EL1'de çalışan Linux çekirdeğidir.

EL2 katmanı, güçlü gizlilik ve bütünlük garantileri ile EL1/EL0'daki bağımsız pVM'lere bellek ve cihazların izole edilmesini 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 hipervizör, 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, yani Sanallaştırma Ana Makine Uzantıları (VHE) (ARMv8.1 ve sonrası) kullanılabilirliğine bağlı olarak farklı yürütme modlarını destekler. Genellikle VHE harici mod olarak bilinen bu modlardan birinde, hipervizör kodu başlatma sırasında çekirdek görüntüsünden ayrılıp EL2'de yüklenir. Çekirdek 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 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, pKVM'ye istisna düzeyi 2 (EL2) erişimi gerektiren güvenlik özelliklerini bağlamanızı sağlar.

pKVM tedarikçi modülünün nasıl uygulanacağını ve yükleneceğini öğrenmek için pKVM tedarikçi modülünü uygulama başlıklı makaleyi inceleyin.

Başlatma prosedürü

Aşağıdaki şekilde pKVM başlatma prosedürü gösterilmektedir:

pKVM başlatma prosedürü

Şekil 1. pKVM başlatma prosedürü

  1. Bootloader, genel çekirdeğe EL2'de 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. Buna ek olarak, pKVM tedarikçi modülleri bu sırada yüklenmektedir.
  3. Genel çekirdek normal bir şekilde başlatılmaya devam eder ve kullanıcı alanına ulaşana kadar gerekli tüm cihaz sürücülerini yükler. pKVM bu noktada devreye girer ve 2. aşama sayfa tablolarını işler.

Başlatma prosedürü, çekirdek görüntüsünün bütünlüğünü yalnızca erken başlatma sırasında korumak için bootloader'a güvenir. Çekirdek ayrıcalığı kaldırıldığında artık hipervizör tarafından güvenilmez hale gelmez. Hipervizör, çekirdek güvenliği ihlal edilse bile kendisini korumaktan sorumludur.

Android çekirdeği ile hipervizörün aynı ikili görüntüde olması, aralarında çok sıkı sıkıya bağlı bir iletişim arayüzü oluşmasına olanak tanır. Bu sıkı bağlantı, iki bileşenin atomik güncellemelerini garanti ederek aralarındaki arayüzü sabit tutma ihtiyacını ortadan kaldırır ve uzun süreli bakımdan ödün vermeden büyük ölçüde esneklik sunar. 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'nın Android ekosisteminde benimsenmesi, pKVM hipervizörünün çekirdekle aynı ikili programda Android cihazlara dağıtılmasına otomatik olarak olanak tanır.

CPU bellek erişimi koruması

Arm mimarisi, iki bağımsız aşamaya bölünmüş bir bellek yönetim birimini (MMU) belirtir. Her ikisi de adres çevirisini ve belleğin farklı bölümlerine erişim denetimini uygulamak için kullanılabilir. 1. aşamadaki MMU EL1 tarafından kontrol edilir ve birinci düzey adres çevirisi sağlar. 1. aşama MMU, Linux tarafından her kullanıcı alanı işlemine ve kendi sanal adres alanına sağlanan sanal adres alanını yönetmek için 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ış adresine ara fiziksel adres (IPA) denir. Not: Sanal adres (VA), önce IPA'ya, ardından PA'ya dönüştürülür.

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 bellek sayfalarını korumaktan sorumlu olur.

KVM, konuklar için karmaşık IPA/PA eşlemeleri uygulamak amacıyla 2. aşamada adres çevirisinden tam olarak yararlanır. Bu sayede fiziksel parçalanmaya rağmen konuklar için bitişik bellek yanıltır. 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 görünümlü arabelleği (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şimi koruması

IOMMU donanımı, en azından bir cihazın fiziksel belleğe okuma/yazma erişimi sayfa ayrıntı düzeyinde verme ve iptal etme yöntemlerini sağlar. Ancak bu IOMMU donanımı, kimlik eşlenmiş 2. aşamayı varsaydığından pVM'lerde cihaz kullanımını sınırlandırır.

Sanal makineler arasında yalıtımı sağlamak amacıyla farklı varlıklar adına oluşturulan bellek işlemleri IOMMU tarafından ayırt edilebilmelidir. Böylece, çeviride uygun sayfa tablosu grubu kullanılabilir.

Buna ek olarak, EL2'de SoC'ye özgü kod miktarının azaltılması, pKVM'nin genel güvenilir bilgi işlem tabanını (TCB) azaltmaya yönelik temel bir stratejidir ve IOMMU sürücülerinin hipervizöre eklenmesine karşı sayaç işlevi görür. Bu sorunu azaltmak amacıyla EL1'deki ana makine; güç yönetimi, başlatma ve uygun durumlarda kesinti işleme gibi yardımcı IOMMU yönetim görevlerinden sorumludur.

Bununla birlikte, cihaz durumunu ana makineye kontrol etmek, IOMMU donanımının programlama arayüzünde, izin kontrollerinin başka yollarla (örneğin, cihaz sıfırlamadan sonra) atlanamayacağından emin olmak için ek gereklilikler uygular.

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 pVM ortaya çıktığında ana makine, başlatılması için bellek sayfaları bağışlar ve hipervizör, bu sayfaların sahipliğini ana makineden pVM'ye geçirir. 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.

Toplantıyı düzenleyen kişiyle iletişim, onlar arasındaki kontrollü bellek paylaşımı sayesinde mümkün olur. Misafirlerin, hiper çağrı kullanarak sayfalarından bazılarını ana makineyle paylaşmalarına izin verilir. Bu hipervizör, ana makine 2. aşama sayfa tablosundaki bu sayfaları yeniden eşlemesi için hipervizöre talimat verir. Benzer şekilde, ana makinenin TrustZone ile iletişimi de bellek paylaşımı ve/veya ödünç verme işlemleriyle mümkün olur. Bunların tümü, Kol İç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şebildiğinden, çağrı yapana ait belirtilen sayfaların sahipliğinin ana makineye geri verilmesini sağlayan bir hiper çağrı sağlanır. Pratikte bu hiper çağrı, VMM'nin pVM'den geri bellek istemesine ve pVM'nin, bırakılan sayfaları kontrollü bir şekilde VMM'ye bildirmesine izin vermek için virtio balon protokolüyle 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 izlemenin büyük bir kısmı, barındırıcıya ve konukların 2. aşama sayfa tablolarına ekli meta veriler kullanılarak yapılır. Adlarından da anlaşılacağı gibi yazılım kullanımı için ayrılmış sayfa tablosu girişlerinde (PTE'ler) ayrılmış bitler kullanılır.

Ana makine, hipervizör tarafından erişilemeyen sayfalara erişmeye çalışmadığından emin olmalıdır. Yasa dışı ana makine erişimi, hipervizör tarafından ana makineye eşzamanlı istisnanın eklenmesine neden olur. Bu da sorumlu kullanıcı alanı görevinin bir SEGV sinyali almasına veya ana makine çekirdeğinin çökmesine neden olabilir. Yanlışlıkla yapılan erişimleri önlemek amacıyla, konuklara bağışlanan sayfalar ana makine çekirdeği tarafından değiştirilmeye veya birleştirilemez.

İşlemeyi ve zamanlayıcıları kesme

Kesintiler, konukların cihazlarla etkileşim kurma sürecinin ve CPU'lar arasındaki iletişimin önemli bir parçasıdır. Ara işlemci kesintileri (IPI'lar) ana iletişim mekanizmasıdır. KVM modeli, tüm sanal kesme yönetimini EL1'deki ana makineye yetkilendirmektir. Bu ana makine bu amaçla hipervizörün 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 ve EL2 arasındaki arayüz, kesmelerle ilgili hipervizör kayıtlarının kopyaları da dahil olmak üzere tam kesme durumunun EL1 ana makinesi tarafından görülebilmesini 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 kaydı çalışma zamanı destek kodu, yalnızca Yazılım Tarafından Oluşturulan Kesme Kaydı (SGIR) ve Kesme Kaydını Devre Dışı Bırakma (DIR) kayıt yakalaması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 emüle edilir ve KVM'deki tüm mevcut altyapı yeniden kullanılır. Son olarak, Kesme Bekleme (WFI) her zaman EL1'e iletilir. Çünkü bu, KVM'nin kullandığı temel planlama temellerinden biridir.

Zamanlayıcı desteği

EL1'in, vCPU engellenirken zamanlayıcı kesmeleri yerleştirebilmesi için sanal zamanlayıcının karşılaştırma değeri, her yakalama WFI'da EL1'e gösterilmelidir. Fiziksel zamanlayıcı tamamen emülasyonludur ve tüm tuzaklar EL1'e aktarılır.

MMIO işleme

Sanal makine monitörü (VMM) ile iletişim kurmak ve GIC emülasyonunu gerçekleştirmek için MMIO tuzakları, daha fazla önceliklendirme için EL1'deki ana makineye geri yönlendirilmelidir. pKVM şunları gerektirir:

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

Ayrıca, kaynak/hedef olarak genel amaçlı kayıt (GPR) bulunan tuzaklar, soyut aktarım sözde kayıt kullanılarak aktarılır.

Misafir arayüzleri

Misafirler, hiper çağrılar ve kapana kısılmış bölgelere bellek erişiminin bir kombinasyonunu kullanarak korunan 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, konuklara kendi vCPU'larının yaşam döngüsünü kontrol etmesi için standart bir mekanizma sağlar. Bu mekanizmanın üzerinde çalıştırma, çevrimdışına alma ve sistemi kapatma gibi işlemler yapılır.
  • TRNG, konukların pKVM'den entropi talep etmesi için standart bir mekanizma sağlar ve çağrıyı EL3'e iletir. Bu mekanizma özellikle ana makineye bir donanım rastgele sayı oluşturucuyu (RNG) sanallaştırma konusunda güvenilemediği durumlarda kullanışlıdır.

pKVM hiperçağrıları

  • Ana makineyle anı paylaşımı. Başlangıçta ana makinenin hiçbir misafir belleğine erişimi olmaz ancak ana makine erişimi, paylaşılan bellekli iletişim ve paylaşılan arabelleklere dayanan paravirüle edilmiş cihazlar için gereklidir. Sayfaların sunucuyla paylaşılması ve paylaşılmasının geri alınması için köprü çağrılar, konukların el sıkışma gerekmeden Android'in geri kalanı için tam olarak hangi bellek bölümlerinin erişilebilir olacağına karar vermesine olanak tanır.
  • Ana makineye bellek bırakma. Tüm konuk belleği genellikle imha edilene kadar konuğa aittir. Bu durum, zaman içinde değişen bellek gereksinimleri olan uzun ömürlü sanal makineler için yetersiz olabilir. relinquish hypercall, bir misafirin konuk tarafından sonlandırmaya gerek kalmadan sayfaların sahipliğini açıkça tekrar ana makineye aktarmasına olanak tanır.
  • Ana makineye bellek erişimi hapsedilmesi. 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 korunan 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 alan hatasının IP erişim hatasının 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 misafirlerin maruz kaldığı 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. Bu VMM, konukdan virtio cihazının MMIO arayüzüne sıkışmış bellek erişimlerini engeller ve beklenen davranışı emüle eder. Cihaza her erişim için VMM'ye ve sonra tekrar gidiş dönüş gerektirdiğinden MMIO erişimi görece 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şebileceğidir. Bu varsayım, sanal makinenin tasarımında da belirgindir. Sanal makine emülasyonu, konuklarda cihaz emülasyonunun doğrudan erişmesinin amaçlandığı tamponlara işaretçiler içerebilir.

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 makineleri hem de bunlara karşılık gelen veri arabelleklerini sabit bir paylaşılan bellek penceresinden ayıracak şekilde yapılandırılır. Veriler pencereye ve pencereden gerektiği şekilde kopyalanır.

Sanal cihaz

Şekil 4. Virtio cihazı

TrustZone ile etkileşim

Misafirler doğrudan TrustZone ile etkileşim kuramasalar da düzenleyenin güvenli dünyaya SMC çağrıları gönderebilmesi gerekir. Bu çağrılar, ana makine tarafından erişilemeyen 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 yakalar 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 düzeyde değişiklikle EL3 donanım yazılımına yönlendirilir. Özellikle, çevrimiçi hale gelen 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. Başlatma sırasında bu koruma, pKVM tarafından uygulanır.

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

Kol için Donanım Yazılımı Çerçevesi (FF-A), özellikle de güvenli bir hipervizör olduğunda normal ve güvenli dünyalar arasındaki etkileşimleri standartlaştırır. 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 kullanarak belleği güvenli dünyayla paylaşma mekanizmasını 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 kullanan bir sistemde bellek erişim modelinin uygulanması, güvenli dünya için 2. aşama sayfa tablolarını barındıran Hafnium gibi bir Secure Partition Manager Core (SPMC) tarafından yapılmalıdır. S-EL2 bulunmayan bir sistemde TEE, bunun yerine 1. aşama sayfa tabloları aracılığıyla bir bellek erişim modelini zorunlu kılabilir.

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

Sanal makine monitörü

crosvm, Linux'un KVM arayüzü üzerinden sanal makineleri çalıştıran bir sanal makine monitörüdür (VMM). Crosvm'yi benzersiz kılan, Rust programlama dili ve ana makine çekirdeğini korumak için sanal cihazların etrafında bir korumalı alan kullanımıyla güvenliğe odaklanmasıdır. Crosvm hakkında daha fazla bilgi için buradaki resmi belgelere bakın.

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

KVM, /dev/kvm karakterli cihazı KVM API'yi oluşturan ioctl ile kullanıcı alanına sunar. İyoctl'lar aşağıdaki kategorilere aittir:

  • Sistem ioctl'leri, tüm KVM alt sistemini etkileyen genel özellikleri sorgulayıp ayarlar ve pVM'ler oluşturur.
  • Sanal makine ioctl'ları, sanal CPU'lar (vCPU'lar) ve cihazlar oluşturan ve bellek düzeni ile sanal CPU (vCPU) ve cihaz sayısı gibi bir pVM'nin tamamını etkileyen özellikleri sorgulayıp ayarlar.
  • vCPU ioctls sorgu eder ve tek bir sanal CPU'nun çalışmasını kontrol eden özellikleri 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 sistemini yayınlamak için kullanılabilecek bir sanal makine dosyası tanımlayıcısı oluşturmak amacıyla KVM_CREATE_VM sistem ioctl'ini kullanır. Sanal makine FD üzerindeki KVM_CREATE_VCPU veya KVM_CREATE_DEVICE ioctl bir vCPU/cihaz oluşturur ve yeni kaynağı işaret eden bir dosya tanımlayıcı döndürür. Bir vCPU veya cihaz FD'sindeki ioctl'lar, sanal makine FD'de ioctl kullanılarak oluşturulan cihazı kontrol etmek için kullanılabilir. vCPU'lar için bu, konuk kodunu çalıştırmayla ilgili önemli bir görevi içerir.

crosvm, dahili olarak uç 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

Bir VMM'nin ana sorumluluklarından biri, sanal makinenin belleğini ayırmak ve bellek düzenini yönetmektir. crosvm, aşağıdaki tabloda genel hatlarıyla 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, kendisini yöneten crosvm örneğiyle ilişkilendirilir ve ana makinede boş bellek kalmamaya 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 sayesinde konuk belleği, konuka bağışlandığında ana makinenin fiziksel adres alanından eşlenmez. Tek istisna, konuk tarafından açıkça paylaşılan bellektir (ör. virtio cihazları).

Davetlinin adres alanındaki MMIO bölgeleri eşlenmeden bırakılır. Konukların bu bölgelere erişimi kilitlenir ve sanal makine FD'de bir G/Ç etkinliği oluşur. Bu mekanizma, sanal cihazları uygulamak için kullanılır. Korumalı modda konukların, yanlışlıkla bilgi sızıntısı riskini azaltmak için adres alanının bir bölgesinin hipercall aracılığıyla MMIO için kullanıldığını kabul etmesi gerekir.

Program yapma

Her sanal CPU, bir POSIX iş parçacığıyla temsil edilir ve ana makine Linux planlayıcısı tarafından planlanır. İş parçacığı, vCPU FD'de KVM_RUN ioctl'i çağırarak hipervizörün konuk vCPU bağlamına geçmesine neden olur. Ana makine planlayıcısı, bir konuk bağlamında harcanan süreyi karşılık gelen 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 yöntemini tekrar çağırır.

KVM_RUN boyunca iş parçacığı, öncelikli olmayan EL2 hipervizör kodunun yürütülmesi haricinde ana makine planlayıcısı tarafından öncelikli olarak 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 HK mekanizmalarına tabidir. Spesifik olarak, her bir vCPU iş parçacığı fiziksel CPU'lara bağlanabilir, cpuse'lara yerleştirilebilir, kullanım sınırlaması kullanılarak güçlendirilebilir veya sınırlandırılabilir, önceliklerinin/programlama politikalarının değiştirilmesi ve daha fazlasını içerir.

Sanal cihazlar

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

  • Kompozit disk görüntüleri, salt okunur veya okuma-yazma için virtio-blk
  • sunucuyla 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 başlatma ROM'una benzer şekilde, bir pVM tarafından yürütülen ilk koddur. pvmfw'nin birincil amacı güvenli önyükleme yapmak ve pVM'nin benzersiz sırrını türetmektir. pvmfw, işletim sistemi düzgün bir şekilde imzalanmış olduğu ve microdroid gibi belirli bir işletim sistemiyle kullanılmasıyla sınırlı değildir.

pvmfw ikilisi, aynı ada sahip bir flash bölümünde depolanır ve OTA kullanılarak güncellenir.

Cihaz başlatma

Aşağıdaki adım dizisi, pKVM özellikli bir cihazın başlatma prosedürüne eklenir:

  1. Android Bootloader (ABL), pvmfw'yi bölümünden belleğe yükler ve görüntüyü doğrular.
  2. ABL, Cihaz Tanımlayıcı Bileşimi Motoru (DICE) gizli anahtarlarını (Bileşik Cihaz Tanımlayıcıları (CDI'ler) ve DICE sertifika zinciri) bir Güven Kökeninden alır.
  3. ABL, pvmfw için gerekli CDI'ları türetir ve pvmfw ikili programına 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 ve Linux'a devrederek 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 başlatıldıktan sonra Microdroid, Mikrodroid belgesinin Başlatma sırası bölümündeki adımlara göre başlatılır.

pVM başlatma

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, başlangıç değerini ayarlayabileceği kayıtların listesinde de kısıtlanmıştır (birincil vCPU için x0-x14, ikincil vCPU'lar için hiçbiri). Kalan kayıtlar ayrılmıştır ve hipervisor-pvmfw ABI'nın 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'nin AVB imzalı çekirdeği yüklemesini bekler. Bu çekirdeği bir önyükleyici veya başka bir görüntü olabilir. Ayrıca, bilinen ofsetlerde belleğe imzasız bir FDT olabilir. pvmfw, AVB imzasını doğrular ve başarılı olursa alınan FDT'den güvenilir bir cihaz ağacı oluşturur, gizli anahtarları bellekten giriş noktasından ve dallara ait yükten siler. Doğrulama adımlarından biri başarısız olursa donanım yazılımı bir PSCI SYSTEM_RESET hipercallı gönderir.

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