AVF mimarisi

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

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 fon

Arm mimarisi, istisna seviyesi 0 (EL0) en az ayrıcalıklı ve istisna seviyesi 3 (EL3) en fazla olmak üzere dört istisna seviyesine kadar izin verir. 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ılanların geri kalanı, EL1'de çalışan Linux çekirdeğidir.

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

hiper yönetici

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şletilen Linux KVM hipervizörü üzerine kurulmuştur.

KVM/arm64, belirli CPU özelliklerinin, yani Sanallaştırma Ana Bilgisayar Uzantılarının (VHE) (ARMv8.1 ve sonrası) mevcudiyetine bağlı olarak farklı yürütme modlarını destekler. Yaygın 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 kurulurken, çekirdeğin kendisi EL1'de çalışır. Linux kod tabanının bir parçası olmasına rağmen, KVM'nin EL2 bileşeni, çoklu EL1'ler arasındaki geçişten sorumlu küçük bir bileşendir ve tamamen ana bilgisayarın çekirdeği tarafından kontrol edilir. Hiper yönetici bileşeni Linux ile derlenmiştir, ancak vmlinux görüntüsünün ayrı, ayrılmış bir bellek bölümünde bulunur. pKVM, hiper yönetici kodunu Android ana bilgisayar çekirdeğine ve kullanıcı alanına kısıtlamalar koymasına olanak tanıyan yeni özelliklerle genişleterek ve ana bilgisayar erişimini konuk belleğine ve hiper denetleyiciye sınırlayarak bu tasarımdan yararlanır.

Önyükleme prosedürü

pKVM önyükleme prosedürü şekil 1'de gösterilmiştir. İlk adım, önyükleyicinin EL2'de pKVM etkin bir Linux çekirdeğine girmesidir. Erken başlatma sırasında, çekirdek EL2'de çalıştığını algılar ve pKVM'yi geride bırakarak kendisini EL1'e 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. Çekirdeğin ayrıcalığı kaldırıldığında, artık çekirdeğin güvenliği ihlal edilmiş olsa bile kendisini korumaktan sorumlu olan hiper yönetici tarafından güvenilir olarak kabul edilmez.

pKVM önyükleme prosedürü

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

Android çekirdeği ve hiper yöneticinin aynı ikili görüntüde olması, aralarında çok sıkı bir şekilde bağlanmış bir iletişim arayüzüne izin verir. Bu sıkı bağlantı, iki bileşenin atomik güncellemelerini garanti eder, bu da aralarındaki arayüzü sabit tutma ihtiyacını ortadan kaldırır ve uzun vadeli bakım kolaylığından ödün vermeden büyük bir esneklik sunar. Sıkı bağlantı, aynı zamanda, hipervizör tarafından sağlanan güvenlik garantilerini etkilemeden her iki bileşenin birlikte çalışabildiği durumlarda performans optimizasyonlarına da olanak tanır.

Ayrıca, Android ekosisteminde GKI'nin benimsenmesi, pKVM hipervizörünün, çekirdek ile 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 çevirisi ve erişim denetimi 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, her bir 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.

Aşama 2 MMU, EL2 tarafından kontrol edilir ve aşama 1 MMU'nun çıkış adresi üzerinde ikinci bir adres çevirisinin uygulanmasını sağlayarak bir fiziksel adres (PA) ile sonuçlanır. Aşama 2 çevirisi, hipervizörler tarafından tüm konuk sanal makinelerinden 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 bir ara fiziksel adres (IPA) denir. 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 çevirisi etkin ve ana bilgisayar Linux çekirdeğini çalıştırırken 2. aşama devre dışı bırakılarak çalışır. Bu mimari, ana bilgisayar aşama 1 MMU'dan bellek erişimlerinin aşama 2 MMU'dan geçmesine izin verir, böylece ana bilgisayardan konuk bellek sayfalarına sınırsız erişime izin verir. Öte yandan, pKVM, ana bilgisayar bağlamında bile 2. aşama koruma sağlar ve ana bilgisayar yerine konuk bellek sayfalarını korumaktan hipervizörü görevlendirir.

KVM, misafirler 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 çevirisini tam olarak kullanır. Ancak, ana bilgisayar için aşama 2 MMU'nun kullanımı yalnızca erişim denetimiyle sınırlıdır. Ana bilgisayar aşaması 2, ana bilgisayar IPA alanındaki bitişik belleğin PA alanında bitişik olmasını sağlamak için kimlik eşlemelidir. Bu mimari, sayfa tablosunda büyük eşlemelerin kullanılmasına izin verir ve sonuç olarak çeviriye bakan arabellek (TLB) üzerindeki baskıyı azaltır. Bir kimlik eşlemesi PA tarafından indekslenebildiğinden, 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, konuk sayfalarının CPU sayfa tablolarında Linux ana bilgisayarından eşlenmesinin kaldırılması, konuk belleğini korumak için gerekli ancak yetersiz bir adımdır. pKVM'nin 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şı da koruma sağlaması gerekir. Bu tür bir cihazın konuk belleğine erişmesini önlemek için, pKVM, sistemdeki her DMA özellikli cihaz için, Şekil 3'te gösterildiği gibi giriş-çıkış bellek 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 aygıt için sayfa ayrıntı düzeyinde fiziksel belleğe 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'yi varsaydıkları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 edilebilmelidir.

Ek olarak, EL2'deki 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 karşı çalışır. Bu sorunu azaltmak için, EL1'deki ana bilgisayar, güç yönetimi, başlatma ve uygun olduğunda kesinti işleme gibi yardımcı IOMMU yönetim görevlerinden sorumludur.

Bununla birlikte, ana bilgisayarı cihaz durumunun denetimine sokmak, örneğin bir cihazın sıfırlanmasının ardından izin kontrollerinin başka yollarla atlanmamasını sağlamak için IOMMU donanımının programlama arayüzüne 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 başvuru çözümüdür.

Bellek sahipliği

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

Ev sahibi ve misafirler arasındaki iletişim, aralarında kontrollü bellek paylaşımı ile sağlanır. Misafirlerin, hiper yöneticiye bu sayfaları ana bilgisayar 2. aşama sayfa tablosunda yeniden eşleştirmesini söyleyen bir hiper çağrı kullanarak sayfalarından bazılarını ev sahibiyle paylaşmalarına izin verilir. Benzer şekilde, ana bilgisayarın TrustZone ile iletişimi, tümü Donanım 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 izlemekten sorumludur. Bu durum izlemenin çoğu, 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ılarak, toplantı sahibine ve konukların 2. aşama sayfa tablolarına eklenen meta veriler kullanılarak yapılır.

Ana bilgisayar, hiper yönetici tarafından erişilemez hale getirilen sayfalara erişmeye çalışmadığından emin olmalıdır. Geçersiz bir ana bilgisayar erişimi, hiper yönetici tarafından ana bilgisayara senkronize bir istisnanın enjekte edilmesine 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, ana bilgisayar çekirdeği tarafından değiştirilemez veya birleştirilemez.

Kesinti yönetimi ve zamanlayıcılar

Kesintiler, bir misafirin 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 arabirim, kesintilerle ilgili hiper yönetici kayıtlarının kopyaları da dahil olmak üzere tam kesme durumunun EL1 ana bilgisayarına görünür olmasını 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ım Tarafından Oluşturulan Kesinti Kaydı (SGIR) ve Kesinti Kaydının Devre Dışı Bırakılması (DIR) kayıt yakalamasını desteklemek için basitleştirilebilir. Mimari, bu kayıtların her zaman EL2'ye tuzaklanmasını zorunlu kılarken, diğer tuzaklar şimdiye kadar yalnızca hataları azaltmak için faydalı olmuştur. Diğer her şey donanımda işleniyor.

MMIO tarafında, her şey KVM'deki mevcut tüm altyapıyı yeniden kullanarak EL1'de taklit edilir. Son olarak, Kesintiyi Bekle (WFI) her zaman EL1'e aktarılır çünkü bu, KVM'nin kullandığı temel zamanlama ilkelerinden biridir.

Zamanlayıcı desteği

Sanal zamanlayıcının karşılaştırıcı değeri, her yakalama WFI'sinde EL1'e maruz bırakılmalıdır, böylece EL1 vCPU engellenirken zamanlayıcı kesmelerini enjekte edebilir. Fiziksel zamanlayıcı tamamen öykünür ve tüm tuzaklar EL1'e aktarılır.

MMIO kullanımı

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

  • IPA ve erişimin boyutu
  • Yazma durumunda veriler
  • Yakalama noktasında CPU'nun endianness

Ek olarak, kaynak/hedef olarak genel amaçlı bir kaydı (GPR) olan tuzaklar, bir soyut aktarım sözde kaydı kullanılarak iletilir.

Misafir arayüzleri

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

Genel hiper çağrılar

  • 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, misafirin çağrıyı EL3'e ileten pKVM'den entropi talep etmesi için standart bir mekanizma sağlar. Bu mekanizma, özellikle bir donanım rastgele sayı üretecini (RNG) sanallaştırmak için ana bilgisayara güvenilemediği durumlarda kullanışlıdır.

pKVM hiper çağrıları

  • Ana bilgisayarla bellek paylaşımı. Tüm konuk belleği başlangıçta ana bilgisayar tarafından erişilemez, ancak ana bilgisayar erişimi, paylaşılan bellek iletişimi ve paylaşılan arabelleklere dayanan sanallaştırılmış cihazlar için gereklidir. Sayfaları ev sahibiyle paylaşmak ve paylaşmaktan vazgeçmek için hiper çağrılar, konuğun bir el sıkışmaya gerek kalmadan Android'in geri kalanı için belleğin hangi bölümlerine erişilebileceğine tam olarak 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 tipik olarak MMIO için kullanılır ve kullanıcı alanında VMM tarafından öykünülür. Bu işlemeyi kolaylaştırmak için, pKVM'nin adresi, kayıt parametreleri ve potansiyel olarak içerikleri gibi hataya neden olan talimatla ilgili ayrıntıları ana bilgisayara geri bildirmesi gerekir; bu, tuzak öngörülmediğinde korunan bir konuktan istemeden hassas verileri açığa çıkarabilecektir. pKVM bu sorunu, konuk daha önce hatalı IPA aralığını erişimlerin ana bilgisayara geri yakalamaya izin verilen biri olarak tanımlamak için bir hiper çağrı yayınlamadığı sürece, bu hataları ölümcül olarak ele alarak çözer. Bu çözüme MMIO koruması denir.

Sanal G/Ç cihazı (virtio)

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

Daha önce açıklanan bellek paylaşımı hiper çağrıları, konuktan ana bilgisayarla sanal veri arabelleklerini paylaşmak için kullanılabilse de, bu paylaşım mutlaka sayfa ayrıntı düzeyinde gerçekleştirilir ve arabellek boyutu bir sayfanınkinden küçükse gerekenden daha fazla veriyi açığa çıkarabilir. . Bunun yerine konuk, paylaşılan belleğin sabit bir penceresinden hem sanal sıraları hem de bunlara karşılık gelen veri arabelleklerini tahsis edecek şekilde yapılandırılır ve veriler gerektiğinde pencereye ve pencereden kopyalanır (sektirilir).

sanal cihaz

Şekil 4. Virtio cihazı

TrustZone ile etkileşim

Misafirler TrustZone ile doğrudan etkileşimde bulunamasalar da, ev sahibi yine de güvenli dünyaya SMC çağrıları gönderebilmelidir. 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ğinden habersiz olduğundan, kötü niyetli bir ana bilgisayar bu arabelleği, karışık bir yardımcı saldırısı (DMA saldırısına benzer) gerçekleştirmek için kullanabilir. Bu tür saldırıları önlemek için pKVM, tüm ana bilgisayar SMC çağrılarını EL2'ye hapseder ve ana bilgisayar ile EL3'teki 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 hale gelen veya askıya alma durumundan devam eden bir CPU için giriş noktası yeniden yazılır, böylece 2. aşama sayfa tablosu EL1'deki ana bilgisayara geri dönmeden önce EL2'de kurulur. Önyükleme sırasında, bu korumalar pKVM tarafından uygulanır.

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

Arm için Firmware Framework (FF-A), özellikle güvenli bir hiper yöneticinin varlığında normal ve güvenli dünyalar arasındaki etkileşimleri standart hale getirir. Spesifikasyonun büyük bir kısmı, temel sayfalar için hem ortak bir mesaj formatı hem de iyi tanımlanmış bir izin modeli kullanarak, güvenli dünya ile hafıza paylaşımı için bir mekanizma tanımlar. pKVM, ana bilgisayarın yeterli izinlere sahip olmadığı güvenli tarafla bellek paylaşmaya çalışmadığından emin olmak için FF-A mesajlarını proxy'ler.

Bu mimari, güvenli dünyada çalışan güvenilir uygulamaların ve diğer yazılımların yalnızca güvenli dünyaya ait 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'ye sahip bir sistemde, bellek erişim modelinin uygulanması, güvenli dünya için 2. aşama sayfa tablolarını koruyan Hafnium gibi bir Secure Partition Manager Core (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ı mesaj değilse, işlenmeyen SMC'ler EL3'e iletilir. Varsayım, (zorunlu olarak güvenilen) güvenli bellenimin, işlenmeyen SMC'leri güvenli bir şekilde işleyebileceğidir, çünkü bellenim, pVM yalıtımını sürdürmek için gereken önlemleri anlar.

Sanal makine monitörü

crosvm, Linux'un KVM arabirimi aracılığıyla sanal makineleri çalıştıran bir sanal makine monitörüdür (VMM). Crosvm'i benzersiz kılan şey, ana bilgisayar çekirdeğini korumak için Rust programlama dili ve sanal aygıtların etrafında bir sanal alan kullanımıyla güvenliğe odaklanmasıdır.

Dosya tanımlayıcıları ve ioctls

KVM, /dev/kvm karakter cihazını KVM API'sini oluşturan ioctls ile kullanıcı alanına sunar. ioctls 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ıt 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ımlayı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ımlayıcı döndürür. Bir vCPU veya cihaz FD'sindeki ioctls, bir VM FD'deki ioctl kullanılarak oluşturulan cihazı kontrol etmek için kullanılabilir. vCPU'lar için bu, konuk kodunu çalıştırmanın önemli görevini içerir.

Dahili olarak, crosvm, sanal makinenin dosya tanımlayıcılarını, kenar tarafından tetiklenen epoll arabirimini kullanarak çekirdeğe kaydeder. Çekirdek daha sonra dosya tanımlayıcılarından herhangi birinde bekleyen yeni bir olay olduğunda crosvm'yi bilgilendirir.

pKVM, pVM ortamı hakkında bilgi almak ve bir VM için korumalı modu ayarlamak için kullanılabilen yeni bir yetenek olan KVM_CAP_ARM_PROTECTED_VM 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 ayırma

Bir VMM'nin ana sorumluluklarından biri, VM'nin belleğini tahsis etmek ve bellek düzenini yönetmektir. crosvm, aşağıdaki tabloda gevşek bir şekilde 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 üretici 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 bilgisayardaki boş bellek tükenmeye başlarsa işlemin sonlandırılmasına (VM'nin sonlandırılması) neden olabilir. Bir VM durdurulduğunda, bellek hiper yönetici tarafından otomatik olarak silinir ve ana bilgisayar çekirdeğine döndürülür.

Normal KVM altında, VMM tüm konuk belleğine erişimi korur. pKVM ile konuk belleği, konuk için bağışlandığında ana bilgisayar fiziksel adres alanından eşlenmez. Bunun tek istisnası, virtio cihazları gibi konuk tarafından açıkça paylaşılan bellektir.

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

zamanlama

Her sanal CPU, bir POSIX iş parçacığı tarafından temsil edilir ve ana bilgisayar Linux zamanlayıcısı tarafından planlanır. İş parçacığı, vCPU FD üzerindeki KVM_RUN çağırır ve bu, hipervizörün konuk vCPU bağlamına geçmesine neden olur. Ana bilgisayar zamanlayıcı, konuk bağlamında harcanan süreyi ilgili vCPU iş parçacığı tarafından kullanılan süre olarak hesaplar. KVM_RUN , G/Ç, kesme sonu veya vCPU'nun durdurulması 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, öncelikli olmayan EL2 hiper yönetici kodunun yürütülmesi dışında, iş parçacığı ana bilgisayar zamanlayıcısı tarafından öncelikli olarak kalır. Konuk pVM'nin kendisi bu davranışı kontrol etmek için bir mekanizmaya sahip değildir.

Tüm vCPU iş parçacıkları, diğer kullanıcı alanı görevleri gibi zamanlandığından, tüm standart QoS mekanizmalarına tabidirler. Spesifik olarak, her vCPU iş parçacığı fiziksel CPU'lara bağlanabilir, işlemci kümelerine yerleştirilebilir, kullanım kenetleme kullanılarak artırılabilir veya sınırlandırılabilir, öncelik/zamanlama ilkelerini değiştirebilir ve daha fazlasını yapabilir.

Sanal cihazlar

crosvm, aşağıdakiler dahil bir dizi cihazı destekler:

  • bileşik disk görüntüleri için virtio-blk, salt okunur veya okunur-yazılır
  • ana bilgisayar ile 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 üretici yazılımı

pVM sabit yazılımı (pvmfw), fiziksel bir cihazın önyükleme ROM'una benzer şekilde bir 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ı elde etmektir. pvmfw, işletim sistemi crosvm tarafından desteklendiği ve uygun şekilde imzalandığı sürece, Microdroid gibi herhangi bir belirli işletim sistemi ile kullanımla sınırlı değildir.

pvmfw ikili dosyası aynı adı taşıyan 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ımlar dizisi eklenir:

  1. Android Önyükleyici (ABL), pvmfw'yi kendi bölümünden belleğe yükler ve görüntüyü doğrular.
  2. ABL, Device Identifier Composition Engine (DICE) sırlarını (Bileşik Aygıt Tanımlayıcıları (CDI'lar) ve Önyükleme Sertifika Zinciri (BCC)) bir Güven Kökünden alır.
  3. ABL, pvmfw'nin sırlarının (CDI'lar) ölçümünü ve DICE türevini gerçekleştirir ve bunları pvmfw ikili dosyasına ekler.
  4. ABL, DT'ye bir linux,pkvm-guest-firmware-memory ayrılmış bellek bölge düğümü ekleyerek, 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, ana bilgisayarın 2. aşama sayfa tablolarından pvmfw bellek bölgesinin eşlemesini kaldırır ve aygıtın çalışma süresi boyunca ana bilgisayardan (ve misafirlerden) korur.

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

pVM önyüklemesi

Bir pVM oluştururken, crosvm (veya başka bir VMM), hiper yönetici tarafından pvmfw görüntüsüyle doldurulacak kadar büyük bir memslot oluşturmalıdır. VMM, başlangıç ​​değerini ayarlayabildiği kayıtlar 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 hypervisor-pvmfw ABI'nin bir parçasıdır.

pVM çalıştırıldığında, hiper yönetici ilk olarak birincil vCPU'nun kontrolünü pvmfw'ye verir. Ürün yazılımı, crosvm'nin bir önyükleyici veya başka bir görüntü olabilen AVB imzalı bir çekirdeği ve bilinen ofsetlerde belleğe 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, 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ğiyle ilgili bilgiler bir bölümde (virtio-blk aygıtı) depolanı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.