AVF mimarisi

Android, Android Sanallaştırma Çerçevesini uygulamak için gereken tüm bileşenlerin bir 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, istisna seviyesi 0 (EL0) en az ayrıcalıklı ve istisna seviyesi 3 (EL3) en fazla olmak üzere dört adede kadar istisna seviyesine izin verir. Android kod tabanının en büyük kısmı (tüm kullanıcı alanı bileşenleri) EL0'da çalışır. Genel olarak "Android" olarak adlandırılanın geri kalanı, EL1'de çalışan Linux çekirdeğidir.

EL2 katmanı, güçlü gizlilik ve bütünlük garantileri ile belleği ve cihazları EL1/EL0'da ayrı pVM'lere ayırmayı sağlayan bir hiper yöneticinin tanıtılmasına olanak tanır.

hipervizör

Korumalı çekirdek tabanlı sanal makine (pKVM) , oluşturma sırasında "korumalı" olarak işaretlenmiş konuk sanal makinelerde çalışan yüklere erişimi kısıtlama yeteneği ile genişletilmiş Linux KVM hipervizörü üzerine kurulmuştur.

KVM/arm64, Sanallaştırma Ana Bilgisayar Uzantıları (VHE) (ARMv8.1 ve üstü) gibi belirli CPU özelliklerinin kullanılabilirliğine bağlı olarak farklı yürütme modlarını destekler. Genel olarak VHE olmayan 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, halbuki çekirdeğin kendisi EL1'de çalışır. KVM'nin EL2 bileşeni, Linux kod tabanının bir parçası olmasına rağmen, birden çok EL1 arasındaki geçişten sorumlu küçük bir bileşendir ve tamamen ana bilgisayarın çekirdeği tarafından kontrol edilir. Hipervizör bileşeni Linux ile derlenir, ancak vmlinux görüntüsünün ayrı, ayrılmış bir bellek bölümünde bulunur. pKVM, hipervizör kodunu Android ana bilgisayar çekirdeğine ve kullanıcı alanına kısıtlamalar koymasına izin veren yeni özelliklerle genişleterek ve konuk belleğine ve hipervizöre ana bilgisayar erişimini sınırlayarak bu tasarımı kullanır.

Önyükleme prosedürü

pKVM önyükleme prosedürü şekil 1'de gösterilmektedir. İlk adım, önyükleyicinin EL2'de pKVM etkinleştirilmiş bir Linux çekirdeğine girmesidir. Erken önyükleme sırasında, çekirdek EL2'de çalıştığını algılar, kendini EL1'e bırakır ve pKVM'yi geride bırakır. Bu noktadan itibaren, Linux çekirdeği, kullanıcı alanına ulaşana kadar gerekli tüm aygıt sürücülerini yükleyerek normal şekilde önyüklemeye devam eder. Bu adımlar, pKVM'nin kontrolü altındayken gerçekleşir.

Önyükleme prosedürü, yalnızca erken önyükleme sırasında çekirdek görüntüsünün bütünlüğünü korumak için önyükleyiciye güvenir. Çekirdek ayrıcalıktan mahrum bırakıldığında, artık hipervizör tarafından güvenilir kabul edilmez ve bu durumda hipervizör, çekirdeğin güvenliği ihlal edilse bile kendisini korumaktan sorumludur.

pKVM önyükleme prosedürü

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

Aynı ikili görüntüde Android çekirdeği ve hiper yöneticiye sahip olmak, 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 ederek aralarındaki arayüzü sabit tutma ihtiyacını ortadan kaldırır ve uzun vadeli sürdürülebilirlikten ödün vermeden büyük ölçüde esneklik sunar. Sıkı bağlantı, her iki bileşen de hiper yönetici tarafından sağlanan güvenlik garantilerini etkilemeden işbirliği yapabildiğinde performans optimizasyonlarına da olanak tanır.

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

CPU bellek erişim koruması

Arm mimarisi, her ikisi de belleğin farklı bölümlerine adres çevirisini ve erişim kontrolünü uygulamak için kullanılabilen iki bağımsız aşamaya bölünmüş bir bellek yönetim birimini (MMU) belirtir. Aşama 1 MMU, EL1 tarafından kontrol edilir ve birinci seviye adres çevirisine izin verir. Aşama 1 MMU, Linux tarafından her bir kullanıcı alanı işlemine ve kendi sanal adres alanına sağlanan sanal adres alanını yönetmek için kullanılır.

Aşama 2 MMU, EL2 tarafından kontrol edilir ve aşama 1 MMU'nun çıkış adresine ikinci bir adres çevirisinin uygulanmasını sağlayarak bir fiziksel adres (PA) sağlar. Aşama 2 çevirisi, hipervizörler tarafından tüm konuk VM'lerden 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, aşama 1'in çıkış adresine ara fiziksel adres (IPA) adı verilir. Not: Sanal adres (VA), bir IPA'ya ve ardından bir PA'ya çevrilir.

CPU bellek erişim koruması

Şekil 2. CPU bellek erişim koruması

Tarihsel olarak KVM, konukları çalıştırırken 2. aşama çeviri etkinken ve ana bilgisayar Linux çekirdeğini çalıştırırken 2. aşama devre dışı olarak çalışır. Bu mimari, konak aşama 1 MMU'dan gelen bellek erişimlerinin aşama 2 MMU'dan geçmesine izin verir, dolayısıyla ana bilgisayardan konuk bellek sayfalarına sınırsız erişim sağlar. Öte yandan, pKVM, ana bilgisayar bağlamında bile 2. aşama koruma sağlar ve ana bilgisayar yerine konuk bellek sayfalarını koruma görevini hiper yöneticiye verir.

KVM, konuklar için fiziksel parçalanmaya rağmen bitişik bellek yanılsaması yaratan karmaşık IPA/PA eşlemelerini uygulamak için 2. aşamada adres çevirisinden tam olarak yararlanır. Ancak, ana bilgisayar için aşama 2 MMU'nun kullanımı yalnızca erişim kontrolü ile sınırlıdır. Ana bilgisayar aşaması 2, kimlik eşlemelidir ve ana bilgisayar 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 izin verir ve sonuç olarak çeviri görünümlü arabellek (TLB) üzerindeki baskıyı azaltır. Bir kimlik eşlemesi PA tarafından dizine eklenebildiği için, ana bilgisayar aşaması 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 bilgisayarındaki konuk sayfalarının eşlemesini kaldırmak, konuk belleğini korumak için gerekli ancak yetersiz bir adımdır. pKVM ayrıca, ana bilgisayar çekirdeğinin kontrolü altındaki DMA özellikli cihazlar tarafından yapılan bellek erişimlerine ve kötü niyetli bir ana bilgisayar tarafından başlatılan bir DMA saldırısı olasılığına karşı koruma sağlamalıdır. Böyle bir cihazın misafir hafızasına erişmesini önlemek için, pKVM, şekil 3'te gösterildiği gibi, sistemdeki her DMA özellikli cihaz için giriş-çıkış hafıza yönetim birimi (IOMMU) donanımı gerektirir.

Dma bellek erişim koruması

Şekil 3. DMA bellek erişim koruması

En azından, IOMMU donanımı, bir cihazın fiziksel belleğe sayfa ayrıntı düzeyinde okuma/yazma erişimi verme ve iptal etme araçlarını sağlar. Bununla birlikte, bu IOMMU donanımı, kimlik eşlemeli bir aşama 2 varsaydığından, pVM'lerde cihazların 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şlemleri, çeviri için uygun sayfa tabloları kümesinin kullanılabilmesi için IOMMU tarafından ayırt edilebilir olmalıdır.

Ek olarak, 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 hiper yöneticiye dahil edilmesine aykırıdır. Bu sorunu hafifletmek için EL1'deki ana bilgisayar, güç yönetimi, başlatma ve uygun olduğunda kesinti yönetimi gibi yardımcı IOMMU yönetim görevlerinden sorumludur.

Bununla birlikte, ana bilgisayarı cihaz durumunun kontrolüne almak, IOMMU donanımının programlama arayüzüne, izin kontrollerinin başka yollarla, örneğin bir cihazın sıfırlanmasından sonra atlanamayacağını garantilemek için ek gereksinimler getirir.

Hem izolasyonu hem de doğrudan atamayı mümkün kılan Arm cihazları için standart ve iyi desteklenen bir IOMMU, Arm System Memory Management Unit (SMMU) mimarisidir. Bu mimari önerilen referans çözümdür.

Bellek sahipliği

Önyükleme sırasında, hipervizör olmayan tüm belleğin ana bilgisayara ait olduğu varsayılır ve bu şekilde hipervizör tarafından izlenir. Bir pVM oluşturulduğunda, ana bilgisayar önyükleme yapmasına izin vermek için bellek sayfalarını bağışlar ve hipervizör bu sayfaların sahipliğini ana bilgisayardan pVM'ye geçirir. Böylece, hipervizör, sayfalara tekrar erişmesini önlemek için ana bilgisayarın 2. aşama sayfa tablosuna erişim kontrolü kısıtlamaları koyar ve konuğa gizlilik sağlar.

Ev sahibi ve misafirler arasındaki iletişim, aralarındaki kontrollü hafıza paylaşımı ile mümkün olmaktadır. Konukların, hipervizöre bu sayfaları ana bilgisayar aşama 2 sayfa tablosunda yeniden eşleştirmesi talimatını veren bir hiper çağrı kullanarak sayfalarının bir kısmını ev sahibiyle tekrar paylaşmalarına izin verilir. Benzer şekilde, ana bilgisayarın TrustZone ile iletişimi, tümü Arm için Ürün Yazılımı Çerçevesi (FF-A) spesifikasyonu kullanılarak pKVM tarafından yakından izlenen ve kontrol edilen bellek paylaşımı ve/veya ödünç verme işlemleriyle mümkün olur.

Hiper yönetici, sistemdeki tüm bellek sayfalarının sahipliğini ve bunların paylaşılıp paylaşılmadığını veya başka varlıklara ödünç verilip verilmediğini takip etmekten sorumludur. Bu durum izlemenin çoğu, adından da anlaşılacağı gibi, yazılım kullanımı için ayrılan sayfa tablosu girişlerinde (PTE'ler) ayrılmış bitler kullanılarak, toplantı sahibine ve konukların 2. aşama sayfa tablolarına eklenmiş meta veriler kullanılarak yapılır.

Ana bilgisayar, hipervizör tarafından erişilemez hale getirilen sayfalara erişmeye çalışmadığından emin olmalıdır. Yasadışı bir ana bilgisayar erişimi, hiper yönetici tarafından ana bilgisayara senkronize bir istisnanın eklenmesine neden olur; bu, sorumlu kullanıcı alanı görevinin bir SEGV sinyali almasına veya ana bilgisayar çekirdeğinin çökmesine neden olabilir. Yanlışlıkla erişimleri önlemek için konuklara bağışlanan sayfalar, barındırma çekirdeği tarafından takas veya birleştirme için uygun hale getirilmez.

Kesinti işleme ve zamanlayıcılar

Kesintiler, bir konuğun cihazlarla etkileşim kurma biçiminin ve işlemciler arası kesintilerin (IPI'ler) ana iletişim mekanizması olduğu CPU'lar arasındaki iletişimin önemli bir parçasıdır. KVM modeli, tüm sanal kesme yönetimini, bu amaçla hipervizörün güvenilmeyen bir parçası gibi davranan EL1'deki ana bilgisayara devretmektir.

pKVM, mevcut KVM kodunu temel alan tam bir Genel Kesinti Denetleyicisi sürüm 3 (GICv3) öykünmesi sunar. Zamanlayıcı ve IPI'ler, bu güvenilmeyen öykünme 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 bilgisayarı tarafından görülebilmesini sağlamalıdır. Bu görünürlük, tipik olarak, sanal CPU (vCPU) başına bir tane olmak üzere paylaşılan bellek bölgeleri kullanılarak gerçekleştirilir.

Sistem kaydı çalışma zamanı destek kodu, yalnızca Yazılımla Oluşturulan Kesme Kaydı (SGIR) ve Devre Dışı Bırakma Kesme Kaydı (DIR) kayıt yakalamayı desteklemek için basitleştirilebilir. Mimari, bu kayıtların her zaman EL2'ye tuzak kurmasını zorunlu kılarken, diğer tuzaklar şimdiye kadar yalnızca hata hatalarını hafifletmek için yararlı olmuştur. Diğer her şey donanımda ele alınıyor.

MMIO tarafında, EL1'de her şey öykünülür ve KVM'deki tüm mevcut altyapı yeniden kullanılır. Son olarak, Kesintiyi Bekle (WFI) her zaman EL1'e iletilir çünkü bu, KVM'nin kullandığı temel programlama ilkellerinden biridir.

Zamanlayıcı desteği

EL1'in vCPU engellenirken zamanlayıcı kesmeleri enjekte edebilmesi için, sanal zamanlayıcı için karşılaştırıcı değeri her yakalama WFI'sında EL1'e maruz bırakılmalıdır. Fiziksel zamanlayıcı tamamen taklit edilir ve tüm tuzaklar EL1'e aktarılır.

MMIO işleme

Sanal makine monitörü (VMM) ile iletişim kurmak ve GIC öykünmesi gerçekleştirmek için, MMIO tuzaklarının daha fazla önceliklendirme için EL1'deki ana bilgisayara geri iletilmesi gerekir. pKVM aşağıdakileri gerektirir:

  • IPA ve erişimin boyutu
  • Yazma durumunda veri
  • Bindirme noktasında CPU'nun endianlığı

Ek olarak, kaynak/hedef olarak genel amaçlı bir kütüğe (GPR) sahip olan tuzaklar, bir soyut aktarım sözde kaydı kullanılarak aktarılır.

Konuk arabirimleri

Bir konuk, hiper aramalar ve kapana kısılmış bölgelere bellek erişimi kombinasyonunu kullanarak korunan bir konukla iletişim kurabilir. Hiper aramalar, KVM tarafından satıcı tahsisi için ayrılmış bir aralıkla SMCCC standardına göre sunulur. Aşağıdaki hiper çağrılar, pKVM misafirleri için özellikle önemlidir.

Genel hiper aramalar

  • PSCI, konuğun çevrimiçi, çevrimdışı ve sistem kapatma dahil olmak üzere vCPU'larının yaşam döngüsünü kontrol etmesi için standart bir mekanizma sağlar.
  • TRNG, konuğun çağrıyı EL3'e ileten pKVM'den entropi talep etmesi için standart bir mekanizma sağlar. Bu mekanizma, bir donanım rasgele sayı üretecini (RNG) sanallaştırmak için ana bilgisayara güvenilemediği durumlarda özellikle kullanışlıdır.

pKVM hiper çağrıları

  • Ana bilgisayarla bellek paylaşımı. Başlangıçta tüm konuk belleğine ana bilgisayar erişemez, ancak paylaşılan bellek iletişimi ve paylaşılan arabelleklere dayanan yarı sanallaştırılmış cihazlar için ana bilgisayar erişimi gereklidir. Ana bilgisayarla sayfaları paylaşmak ve paylaşımını kaldırmak için hiper çağrılar, konuğun, bir el sıkışmaya gerek kalmadan, belleğin tam olarak hangi bölümlerinin Android'in geri kalanı tarafından erişilebilir hale getirileceğine karar vermesine olanak tanır.
  • Ana bilgisayara bellek erişimi yakalama. Geleneksel olarak, bir KVM konuğu geçerli bir bellek bölgesine karşılık gelmeyen bir adrese erişirse, vCPU iş parçacığı ana bilgisayara çıkar ve erişim genellikle MMIO için kullanılır ve kullanıcı alanında VMM tarafından taklit edilir. Bu işlemeyi kolaylaştırmak için, pKVM'nin adresi, kayıt parametreleri ve potansiyel olarak bunların içerikleri gibi hata talimatıyla ilgili ayrıntıları ana bilgisayara bildirmesi gerekir; pKVM, konuk daha önce hatalı IPA aralığını, erişimlerin ana bilgisayara geri yakalamasına izin verilen aralık olarak tanımlamak için bir hiper çağrı yayınlamadıysa, bu hataları ölümcül olarak ele alarak bu sorunu çözer. Bu çözüme MMIO koruması adı verilir.

Sanal G/Ç cihazı (virtio)

Virtio, yarı sanallaştırılmış aygıtları uygulamak ve bunlarla etkileşim kurmak için popüler, taşınabilir ve olgunlaşmış bir standarttır. Korunan misafirlere maruz kalan cihazların çoğu virtio kullanılarak gerçekleştirilir. 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ı tipik olarak, konuktan virtio cihazının MMIO arayüzüne giden sıkışmış bellek erişimlerini yakalayan ve beklenen davranışı taklit eden VMM tarafından ana bilgisayarın kullanıcı alanında uygulanır. MMIO erişimi nispeten pahalıdır, çünkü cihaza her erişim VMM'ye gidiş-dönüş gerektirir, bu nedenle cihaz ile konuk arasındaki gerçek veri aktarımının çoğu, bellekteki bir dizi sanal sıra kullanılarak gerçekleşir. Virtio'nun önemli bir varsayımı, ana bilgisayarın konuk belleğine keyfi olarak erişebilmesidir. Bu varsayım, cihaz öykünmesinin doğrudan erişmesi amaçlanan konuktaki arabelleklere işaretçiler içerebilen virtqueue tasarımında belirgindir.

Daha önce açıklanan bellek paylaşım hiper çağrıları, konuktan ana bilgisayara virtio veri arabelleklerini paylaşmak için kullanılabilse de, bu paylaşım zorunlu olarak sayfa parçalılığında gerçekleştirilir ve arabellek boyutu bir sayfanınkinden küçükse gerekenden daha fazla verinin açığa çıkmasına neden olabilir. . Bunun yerine konuk, verilerin gerektiği gibi pencereye kopyalanması (sekmesi) ile sabit bir paylaşılan bellek penceresinden hem virtqueu'ları hem de bunlara karşılık gelen veri arabelleklerini tahsis edecek şekilde yapılandırılır.

sanal cihaz

Şekil 4. Virtio cihazı

TrustZone ile Etkileşim

Misafirler TrustZone ile doğrudan etkileşime giremese de, toplantı sahibinin güvenli dünyaya SMC aramaları yapabilmesi gerekir. Bu çağrılar, ana bilgisayar tarafından erişilemeyen, fiziksel olarak adreslenmiş bellek arabelleklerini belirtebilir. Güvenli yazılım genellikle arabelleğin erişilebilirliğinin farkında olmadığından, kötü niyetli bir ana bilgisayar bu arabelleği kafası karışmış bir yardımcı saldırı (DMA saldırısına benzer) gerçekleştirmek için kullanabilir. Bu tür saldırıları önlemek için pKVM, EL2'ye yapılan tüm ana bilgisayar SMC çağrılarını yakalar ve EL3'te ana bilgisayar ile güvenli monitör arasında bir proxy görevi görür.

Ana bilgisayardan gelen PSCI çağrıları, minimum değişiklikle EL3 üretici yazılımına iletilir. Spesifik olarak, çevrimiçi duruma gelen veya askıya alma durumundan devam eden bir CPU'nun giriş noktası, EL1'deki ana bilgisayara dönmeden önce aşama 2 sayfa tablosunun EL2'ye yüklenmesi için yeniden yazılır. Önyükleme sırasında, bu korumalar pKVM tarafından uygulanır.

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

Arm için Ürün Yazılımı Çerçevesi (FF-A), özellikle güvenli bir hipervizör varlığında normal ve güvenli dünyalar arasındaki etkileşimleri standartlaştırır. Spesifikasyonun büyük bir kısmı, hem ortak bir mesaj formatı hem de temel sayfalar için iyi tanımlanmış bir izin modeli kullanarak, belleği güvenli dünya ile paylaşmak için bir mekanizma tanımlar. pKVM, ana bilgisayarın yeterli izinlere sahip olmadığı güvenli tarafla belleği paylaşmaya çalışmadığından emin olmak için FF-A mesajlarını proxy'ler.

Bu mimari, 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 özel olarak sahip olması veya FF kullanılarak açıkça paylaşılmış olması durumunda belleğe erişebilmesini sağlamak için bellek erişim modelini zorlayan güvenli dünya yazılımına dayanır. -A. S-EL2 içeren 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ölüm Yöneticisi Çekirdeği (SPMC) tarafından yapılmalıdır. S-EL2'siz bir sistemde, TEE bunun yerine aşama 1 sayfa tabloları aracılığıyla bir bellek erişim modelini zorlayabilir.

EL2'ye yapılan SMC çağrısı bir PSCI çağrısı veya FF-A tanımlı bir mesaj değilse, işlenmeyen SMC'ler EL3'e iletilir. Varsayım, (zorunlu olarak güvenilir) güvenli bellenimin işlenmeyen SMC'leri güvenli bir şekilde işleyebileceğidir, çünkü bellenim pVM izolasyonunu sürdürmek için gereken önlemleri anlar.

Sanal makine monitörü

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

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

KVM /dev/kvm karakter cihazını KVM API'sini oluşturan ioctls ile kullanıcı alanına sunar. ioctl'ler aşağıdaki kategorilere aittir:

  • Sistem ioctls, tüm KVM alt sistemini etkileyen global öznitelikleri sorgular ve ayarlar ve pVM'ler oluşturur.
  • VM ioctls, sanal CPU'lar (vCPU'lar) ve aygıtlar oluşturan ve bellek düzeni ve sanal CPU'lar (vCPU'lar) ve aygıtların sayısı dahil olmak üzere tüm bir pVM'yi etkileyen öznitelikleri sorgular ve ayarlar.
  • vCPU ioctls, tek bir sanal CPU'nun çalışmasını kontrol eden öznitelikleri sorgular ve ayarlar.
  • Cihaz ioctls, tek bir sanal cihazın çalışmasını kontrol eden öznitelikleri sorgular ve ayarlar.

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

Dahili olarak, crosvm, sanal makinenin dosya tanıtıcılarını uç tetiklemeli epoll arabirimini kullanarak çekirdeğe kaydeder. Çekirdek daha sonra herhangi bir dosya tanıtıcıda bekleyen yeni bir olay olduğunda crosvm'yi bilgilendirir.

pKVM, pVM ortamı hakkında bilgi almak ve bir VM için korumalı mod ayarlamak için kullanılabilen KVM_CAP_ARM_PROTECTED_VM adlı yeni bir yetenek ekler. crosvm --protected-vm bayrağı geçirilirse, pVM sabit yazılımı için uygun miktarda belleği sorgulamak ve ayırmak ve ardından korumalı modu etkinleştirmek için pVM oluşturma sırasında bunu kullanır.

Bellek tahsisi

Bir VMM'nin ana sorumluluklarından biri, VM'nin belleğini tahsis etmek 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
Boş alan ...
ramdisk ALIGN_UP(KERNEL_END, 0x1000000)
Çekirdek 0x80080000
Önyükleyici 0x80200000
BIOS modunda FDT 0x80000000
Fiziksel bellek tabanı 0x80000000
pVM sabit yazılımı 0x7FE00000
Cihaz hafızası 0x10000 - 0x40000000

Fiziksel bellek, mmap ile ayrılır ve bellek, memslots adı verilen bellek bölgelerini KVM_SET_USER_MEMORY_REGION ioctl ile doldurmak için VM'ye bağışlanır. Bu nedenle tüm konuk pVM belleği, onu yöneten crosvm örneğine atfedilir ve ana bilgisayarın boş belleği tükenmeye başlarsa işlemin öldürülmesine (VM'nin sonlandırılması) neden olabilir. Bir VM durdurulduğunda, bellek hipervizör tarafından otomatik olarak silinir ve ana bilgisayar çekirdeğine geri döndürülür.

Normal KVM kapsamında, VMM tüm konuk belleğine erişimi elinde tutar. pKVM ile konuk hafızası, konuğa bağışlandığında ana bilgisayar fiziksel adres alanından eşleştirilmez. Bunun tek istisnası, virtio cihazlarda olduğu gibi konuk tarafından açıkça paylaşılan bellektir.

Konuğun adres alanındaki MMIO bölgeleri eşleştirilmeden bırakılır. Konuk tarafından bu bölgelere erişim yakalanır ve VM FD'de bir G/Ç olayıyla sonuçlanır. Bu mekanizma, sanal aygıtları uygulamak için kullanılır. Korumalı modda, yanlışlıkla bilgi sızıntısı riskini azaltmak için konuk, adres alanının bir bölgesinin hiper çağrı kullanan MMIO için kullanıldığını kabul etmelidir.

planlama

Her sanal CPU, bir POSIX iş parçacığı tarafından temsil edilir ve ana bilgisayar Linux zamanlayıcısı tarafından programlanır. İş parçacığı, vCPU FD'de KVM_RUN ioctl'yi çağırarak hipervizörün konuk vCPU içeriğine geçmesine neden olur. Ana makine planlayıcı, ilgili vCPU iş parçacığı tarafından kullanılan süre olarak konuk bağlamında harcanan süreyi hesaba katar. KVM_RUN G/Ç, kesme sonu veya vCPU durdurulmuş gibi VMM tarafından işlenmesi gereken bir olay olduğunda döner. VMM olayı işler ve tekrar KVM_RUN çağırır.

KVM_RUN sırasında, iş parçacığı, öncelikli olmayan EL2 hipervizör kodunun yürütülmesi dışında ana makine planlayıcısı tarafından öncelikli olarak kalır. Konuk pVM'nin kendisinin bu davranışı kontrol etmek için bir mekanizması yoktur.

Tüm vCPU iş parçacıkları diğer herhangi bir kullanıcı alanı görevi gibi planlandığından, tüm standart QoS mekanizmalarına tabidirler. Spesifik olarak, her bir vCPU iş parçacığı, fiziksel CPU'lara affine edilebilir, cpuset'lere yerleştirilebilir, kullanım kıstırma kullanılarak artırılabilir veya kapatılabilir, öncelik/zamanlama politikaları değiştirilebilir ve daha fazlası yapılabilir.

Sanal cihazlar

crosvm, aşağıdakiler de dahil olmak üzere bir dizi cihazı destekler:

  • bileşik disk görüntüleri için virtio-blk, salt okunur veya okuma-yazma
  • Ana bilgisayarla iletişim için vhost-vsock
  • virtio-pci, virtio aktarımı olarak
  • pl030 gerçek zamanlı saat (RTC)
  • Seri iletişim için 16550a UART

pVM sabit yazılımı

pVM bellenimi (pvmfw), fiziksel bir cihazın önyükleme ROM'una benzer şekilde, bir pVM tarafından yürütülen ilk koddur. pvmfw'nin birincil hedefi, güvenli önyüklemeyi başlatmak ve pVM'nin benzersiz sırrını elde etmektir. İşletim sistemi crosvm tarafından desteklendiği ve uygun şekilde imzalandığı sürece pvmfw, Microdroid gibi belirli bir işletim sistemiyle kullanımla sınırlı değildir.

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

Cihaz önyüklemesi

pKVM özellikli bir aygıtın önyükleme prosedürüne aşağıdaki adım dizisi eklenir:

  1. Android Bootloader (ABL), pvmfw'yi kendi bölümünden belleğe yükler ve görüntüyü doğrular.
  2. ABL, Cihaz Tanımlayıcı Oluşturma Motoru (DICE) sırlarını (Bileşik Cihaz Tanımlayıcıları (CDI'ler) ve Önyükleme Sertifika Zinciri (BCC)) bir Güven Kökünden alır.
  3. ABL, pvmfw sırlarının (CDI'ler) ölçümünü ve DICE türetmesini gerçekleştirir ve bunları pvmfw ikili dosyasına ekler.
  4. ABL, DT'ye bir linux,pkvm-guest-firmware-memory ayrılmış bellek bölgesi düğümü ekler ve pvmfw ikili dosyasının konumunu ve boyutunu ve önceki adımda türettiği sırları açıklar.
  5. ABL, kontrolü Linux'a devreder ve Linux, pKVM'yi başlatır.
  6. pKVM, pvmfw bellek bölgesinin ana bilgisayarın 2. aşama sayfa tablolarından haritasını çıkarır ve cihazın çalışma süresi boyunca onu ana bilgisayardan (ve konuklardan) korur.

Cihaz önyüklemesinden sonra Microdroid, Microdroid belgesinin Önyükleme sırası bölümündeki adımlara göre önyüklenir.

pVM önyüklemesi

Bir pVM oluştururken, 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 listesinde de kısıtlanır (birincil vCPU için x0-x14, ikincil vCPU'lar için hiçbiri). Kalan kayıtlar ayrılmıştır ve hypervisor-pvmfw ABI'nin parçasıdır.

pVM çalıştırıldığında, hipervizör önce birincil vCPU'nun kontrolünü pvmfw'ye devreder. Üretici yazılımı, crosvm'nin, bir önyükleyici veya başka herhangi bir görüntü olabilen AVB imzalı bir çekirdeği ve bilinen ofsetlerde belleğe işaretsiz bir FDT yüklemiş olmasını bekler. pvmfw, AVB imzasını doğrular ve başarılı olursa, alınan FDT'den güvenilir bir aygıt ağacı oluşturur, sırlarını bellekten siler ve yükün giriş noktasına dallanır. Doğrulama adımlarından biri başarısız olursa, üretici yazılımı bir PSCI SYSTEM_RESET hiper çağrısı gönderir.

Önyüklemeler arasında, pVM örneği hakkındaki bilgiler bir bölümde (virtio-blk cihazı) saklanır ve yeniden başlatmanın ardından sırrın doğru örneğe sağlanmasını sağlamak için pvmfw'nin sırrı ile şifrelenir.