AVF mimarisi

Android, Android Sanallaştırma Çerçevesini 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 az dört istisna düzeyine izin verir; istisna düzeyi 0 (EL0) en az ayrıcalıklı ve istisna düzeyi 3 (EL3) en fazla ayrıcalıklıdır. Android kod tabanının en büyük kısmı (tüm kullanıcı alanı bileşenleri) EL0'da çalışır. Yaygın olarak "Android" olarak adlandırılan geri kalan kısım, EL1'de çalışan Linux çekirdeğidir.

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

Hipervizör

Korumalı çekirdek tabanlı sanal makine (pKVM) , oluşturulma sırasında 'korumalı' olarak işaretlenen konuk sanal makinelerde çalışan yüklere erişimi kısıtlama özelliğiyle 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 üstü) kullanılabilirliğine 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 yüklenir, oysa çekirdeğin kendisi EL1'de çalışır. Linux kod tabanının bir parçası olmasına rağmen, KVM'nin EL2 bileşeni, birden fazla EL1 arasındaki geçişten sorumlu olan ve tamamen ana bilgisayarın çekirdeği tarafından kontrol edilen küçük bir bileşendir. Hypervisor bileşeni Linux ile derlenmiştir ancak vmlinux görüntüsünün ayrı, özel bir bellek bölümünde bulunur. pKVM, hipervizör kodunu yeni özelliklerle genişleterek, Android ana bilgisayar çekirdeğine ve kullanıcı alanına kısıtlamalar getirmesine ve konuk belleğine ve hipervizöre ana bilgisayar erişimini sınırlandırmasına olanak tanıyarak bu tasarımdan yararlanır.

pKVM satıcı modülleri

Bir pKVM satıcı modülü, giriş-çıkış bellek yönetim birimi (IOMMU) sürücüleri gibi aygıta özgü işlevleri 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 taşımanıza olanak tanır.

Bir pKVM satıcı modülünün nasıl uygulanacağını ve yükleneceğini öğrenmek için, bkz. Bir pKVM satıcı modülünün uygulanması .

Önyükleme prosedürü

Aşağıdaki şekil pKVM önyükleme prosedürünü göstermektedir:

pKVM önyükleme prosedürü

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

  1. Önyükleyici genel çekirdeğe EL2'den girer.
  2. Jenerik çekirdek, EL2'de çalıştığını tespit eder ve pKVM ve modülleri EL2'de çalışmaya devam ederken kendisini EL1'e devreder. Ayrıca pKVM satıcı modülleri de bu sırada yüklenir.
  3. Genel çekirdek, 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 noktada pKVM mevcuttur ve 2. aşama sayfa tablolarını yönetir.

Önyükleme prosedürü, yalnızca erken önyükleme sırasında çekirdek görüntüsünün bütünlüğünü koruması için önyükleyiciye güvenir. Çekirdeğin ayrıcalıkları kaldırıldığında, hipervizör artık ona güvenmiyor ve bu durumda çekirdek tehlikeye girse bile kendisini korumaktan sorumlu oluyor.

Android çekirdeğinin ve hipervizörün aynı ikili görüntüde olması, aralarında çok sıkı bir şekilde bağlanmış bir iletişim arayüzüne 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 vadeli bakım kolaylığından ödün vermeden büyük miktarda esneklik sunar. Sıkı bağlantı aynı zamanda, her iki bileşenin hiper yönetici tarafından sağlanan güvenlik garantilerini etkilemeden birlikte çalışabildiği durumlarda performans optimizasyonlarına da olanak tanır.

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

CPU belleği erişim koruması

Arm mimarisi, her ikisi de belleğin farklı bölümlerine adres çevirisi ve erişim kontrolü 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 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ına olanak tanır ve bu, fiziksel bir adres (PA) ile sonuçlanır. 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 belleği erişim koruması

Şekil 2. CPU belleği erişim koruması

Geçmişte KVM, konukları çalıştırırken 2. aşama çeviri etkinken ve ana Linux çekirdeğini çalıştırırken 2. aşama devre dışı bırakılarak çalışır. Bu mimari, ana bilgisayar aşaması 1 MMU'dan gelen 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 korumayı mümkün kılar ve ana bilgisayar yerine konuk bellek sayfalarını korumakla hipervizörü görevlendirir.

KVM, konuklara yönelik karmaşık IPA/PA eşlemelerini uygulamak için 2. aşamada adres çevirisinden tam olarak yararlanır; bu, fiziksel parçalanmaya rağmen konuklar için bitişik bellek yanılsaması yaratır. Ancak ana bilgisayar için aşama 2 MMU'nun kullanımı yalnızca erişim kontrolüyle 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ğlayacak şekilde kimlik eşlemelidir. Bu mimari, sayfa tablosunda büyük eşlemelerin kullanılmasına olanak tanır ve sonuç olarak çeviri görünüm arabelleği (TLB) üzerindeki baskıyı azaltır. Bir kimlik eşlemesi PA tarafından dizine eklenebildiğinden, ana bilgisayar aşaması 2 aynı zamanda 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ındaki konuk sayfalarının Linux ana bilgisayarından eşlenmesinin kaldırılması, konuk belleğinin korunması 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 DMA saldırısı olasılığına karşı da koruma sağlaması gerekir. Böyle bir cihazın konuk 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ına ihtiyaç duyar.

Dma hafıza erişim koruması

Şekil 3. DMA belleği erişim koruması

IOMMU donanımı, en azından, bir aygıtın fiziksel belleğe sayfa ayrıntı düzeyinde okuma/yazma erişimini verme ve iptal etme araçlarını sağlar. Ancak bu IOMMU donanımı, kimlik eşlemeli aşama 2'yi varsaydıkları için pVM'lerdeki 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şlemlerinin IOMMU tarafından ayırt edilebilmesi gerekir; böylece çeviri için uygun sayfa tabloları kümesi kullanılabilir.

Ek olarak, EL2'deki SoC'ye özgü kod miktarının azaltılması, 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 ters düşer. 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ın cihaz durumunun kontrolünü ele geçirmesi, izin kontrollerinin örneğin cihazın sıfırlanmasının ardından başka yollarla atlanamamasının sağlanması 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 Sistemi Bellek Yönetim Birimi (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 hipervizör tarafından bu şekilde 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 aktarır. Böylece, hipervizör, ana bilgisayarın 2. aşama sayfa tablosuna, sayfalara tekrar erişmesini önlemek için erişim kontrolü kısıtlamaları uygulayarak konuğa gizlilik sağlar.

Ev sahibi ve misafirler arasındaki iletişim, aralarındaki kontrollü hafıza paylaşımıyla mümkün olur. Konukların, hipervizöre bu sayfaları ana bilgisayar aşama 2 sayfa tablosunda yeniden eşlemesi talimatını veren bir hiper çağrı kullanarak sayfalarından bazılarını ana bilgisayarla geri paylaşmalarına izin verilir. Benzer şekilde, ana bilgisayarın TrustZone ile iletişimi, tümü Armware Framework (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.

Bir pVM'nin bellek gereksinimleri zaman içinde değişebileceğinden, arayana ait belirli sayfaların sahipliğinin ana bilgisayara geri verilmesine izin veren bir hiper çağrı sağlanır. Uygulamada bu hiper çağrı, VMM'nin pVM'den belleği geri talep etmesine ve pVM'nin, bırakılan sayfaları VMM'ye kontrollü bir şekilde bildirmesine izin vermek için sanal balon protokolüyle birlikte kullanılır.

Hiper yönetici, sistemdeki tüm bellek sayfalarının sahipliğini ve bunların başka varlıklarla paylaşılıp paylaşılmadığını veya ödünç verilip verilmediğini izlemekten sorumludur. Bu durum izlemenin çoğu, ana bilgisayar ve konukların 2. aşama sayfa tablolarına eklenen meta veriler kullanılarak, 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 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, hipervizör tarafından ana bilgisayara eşzamanlı bir istisna 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ştirilmeye veya birleştirilmeye uygun hale getirilmez.

Kesinti yönetimi ve zamanlayıcılar

Kesintiler, bir konuğun cihazlarla etkileşim kurma biçiminin ve CPU'lar arasındaki iletişimin önemli bir parçasıdır; burada işlemciler arası kesintiler (IPI'ler) ana iletişim mekanizmasıdır. KVM modeli, tüm sanal kesinti 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) emülasyonu 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, kesintilerle 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 genellikle 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 Kesinti Kaydı (SGIR) ve Kesinti Kaydını Devre Dışı Bırakma (DIR) kayıt yakalamayı destekleyecek şekilde basitleştirilebilir. Mimari, bu kayıtların her zaman EL2'ye tuzak kurmasını zorunlu kılarken, diğer tuzaklar şu ana kadar yalnızca hataları azaltmak için yararlı olmuştur. Geriye kalan her şey donanımsal olarak hallediliyor.

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

Zamanlayıcı desteği

Sanal zamanlayıcının karşılaştırıcı değerinin, her yakalama WFI'sında EL1'e sunulması gerekir; böylece EL1, vCPU engellendiğinde zamanlayıcı kesintilerini enjekte edebilir. Fiziksel zamanlayıcı tamamen taklit edilmiştir ve tüm tuzaklar EL1'e aktarılmıştır.

MMIO kullanımı

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

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

Ek olarak, kaynak/hedef olarak genel amaçlı kayıt (GPR) içeren tuzaklar, soyut aktarım sözde kaydı kullanılarak aktarılır.

Konuk arayüzleri

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

Genel hiper çağrılar

  • PSCI, konuğun çevrimiçi olma, çevrimdışı olma 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ırma konusunda ana bilgisayara güvenilemediği durumlarda kullanışlıdır.

pKVM hiper çağrıları

  • Ana bilgisayarla hafıza paylaşımı. Konuk belleğinin tamamına ana bilgisayar başlangıçta erişemez, ancak paylaşılan bellek iletişimi ve paylaşılan arabelleklere dayanan paravirtualleştirilmiş cihazlar için ana bilgisayar erişimi gereklidir. Ana bilgisayarla sayfaları paylaşmaya ve paylaşmayı kaldırmaya yönelik hiper çağrılar, misafirin, 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 hafızanın bırakılması. Tüm misafir hafızası genellikle yok edilene kadar konuğa aittir. Bu durum, bellek gereksinimleri zamanla değişen uzun ömürlü VM'ler için yetersiz olabilir. relinquish hiper çağrısı, konuğun sonlandırılmasına gerek kalmadan sayfaların sahipliğini açıkça ana bilgisayara geri aktarmasına olanak tanır.
  • Ana bilgisayara bellek erişiminin yakalanması. 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, hataya neden olan talimatla ilgili adres, kayıt parametreleri ve potansiyel olarak içerikleri gibi ayrıntıları ana bilgisayara geri göndermesi gerekir; bu, tuzak beklenmediği takdirde korunan bir misafirden gelen hassas verileri istemeden açığa çıkarabilir. pKVM, konuk daha önce, erişimlerin ana bilgisayara geri dönmesine izin verilen hatalı IPA aralığını tanımlamak için bir hiper çağrı yapmadığı sürece, bu hataları ölümcül olarak değerlendirerek bu sorunu çözer. Bu çözüme MMIO koruması denir.

Sanal G/Ç cihazı (virtio)

Virtio, paravirtualleştirilmiş cihazları uygulamak ve bunlarla etkileşime geçmek için popüler, taşınabilir ve olgun bir standarttır. Korunan misafirlere sunulan cihazların çoğunluğu virtio kullanılarak uygulanmaktadır. Virtio ayrıca korumalı bir konuk ile Android'in geri kalanı arasındaki iletişim için kullanılan vsock uygulamasını da destekler.

Virtio cihazları tipik olarak ana bilgisayarın kullanıcı alanında VMM tarafından uygulanır; bu, konuktan virtio cihazının MMIO arayüzüne tuzaklanmış bellek erişimlerini keser ve beklenen davranışı taklit eder. MMIO erişimi nispeten pahalıdır çünkü cihaza her erişim VMM'ye gidiş-dönüş gerektirir, dolayısıyla cihaz ile konuk arasındaki gerçek veri aktarımının çoğu bellekteki bir dizi sanal kuyruk kullanılarak gerçekleşir. Virtio'nun temel varsayımlarından biri, ana bilgisayarın misafir belleğine keyfi olarak erişebilmesidir. Bu varsayım, cihaz emülasyonunun doğrudan erişmesi amaçlanan konuktaki arabelleklere yönelik işaretçiler içerebilen sanal kuyruğun tasarımında açıkça görülmektedir.

Daha önce açıklanan bellek paylaşımı hiper çağrıları konuktan ana bilgisayara sanal veri arabelleklerini paylaşmak için kullanılabilse de, bu paylaşım zorunlu olarak sayfa ayrıntı düzeyinde gerçekleştirilir ve arabellek boyutu bir sayfanın boyutundan küçükse gerekenden daha fazla verinin açığa çıkmasıyla sonuçlanabilir. . Bunun yerine, konuk, hem sanal kuyrukları hem de bunlara karşılık gelen veri arabelleklerini, paylaşılan belleğin sabit bir penceresinden tahsis edecek ve veriler gerektiğinde pencereye kopyalanacak (geri dönecek) şekilde yapılandırılmıştır.

Sanal cihaz

Şekil 4. Virtio cihazı

TrustZone ile Etkileşim

Konuklar TrustZone ile doğrudan etkileşime giremese de, ev sahibinin yine de güvenli dünyaya SMC çağrıları 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ğinden habersiz olduğundan, kötü niyetli bir ana bilgisayar bu arabelleği karışık 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, tüm ana bilgisayar SMC çağrılarını EL2'ye yakalar 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 ürün yazılımına iletilir. Spesifik olarak, çevrimiçi olan veya askıya alma durumundan devam eden bir CPU'nun giriş noktası, 2. aşama sayfa tablosunun EL1'deki ana bilgisayara dönmeden önce EL2'ye kurulacağı şekilde yeniden yazılır. Önyükleme sırasında bu koruma 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ı yoluyla PSCI'yı destekleyen SoC'ye dayanır.

Arm için Firmware Çerçevesi (FF-A), özellikle güvenli bir hipervizörün 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ünyayla paylaşmaya yönelik 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 olarak kullanır.

Bu mimari, güvenilir uygulamaların ve güvenli dünyada çalışan diğer yazılımların yalnızca güvenli dünyaya ait olması veya FF kullanılarak açıkça onunla paylaşılmış olması durumunda belleğe erişebilmesini sağlamak için bellek erişim modelini güçlendiren güvenli dünya yazılımına dayanır. -A. S-EL2'li bir sistemde, bellek erişim modelinin uygulanması, 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 1. aşama 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, (mutlaka güvenilen) güvenli bellenimin işlenmeyen SMC'leri güvenli bir şekilde işleyebileceğidir çünkü bellenim pVM izolasyonunu korumak 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'i benzersiz kılan şey, Rust programlama dilinin kullanılması ve ana bilgisayar çekirdeğini korumak için sanal cihazların etrafında bir sanal alan kullanılmasıyla güvenliğe odaklanmasıdır. Crosvm hakkında daha fazla bilgi için buradaki resmi belgelerine bakın.

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

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

  • Sistem ioctl'leri, tüm KVM alt sistemini etkileyen genel nitelikleri sorgular ve ayarlar ve pVM'ler oluşturur.
  • VM ioctls, sanal CPU'lar (vCPU'lar) ve cihazlar oluşturan ve bellek düzeni ve sanal CPU'ların (vCPU'lar) ve cihazların sayısı gibi tüm pVM'yi etkileyen nitelikleri sorgular ve ayarlar.
  • vCPU ioctls, tek bir sanal CPU'nun çalışmasını denetleyen öznitelikleri sorgular ve ayarlar.
  • Device ioctls, tek bir sanal aygıtın çalışmasını denetleyen ö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. VM FD'deki KVM_CREATE_VCPU veya KVM_CREATE_DEVICE ioctl, bir vCPU/aygıt oluşturur ve yeni kaynağa işaret eden bir dosya tanımlayıcı döndürür. Bir vCPU veya cihaz FD'sindeki ioctl'ler, VM FD'deki 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 de içerir.

Dahili olarak crosvm, kenarla tetiklenen epoll arayüzünü kullanarak VM'nin dosya tanımlayıcılarını çekirdeğe kaydeder. Daha sonra çekirdek, dosya tanımlayıcılardan 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ılabilecek yeni bir özellik olan KVM_CAP_ARM_PROTECTED_VM ekler. crosvm, --protected-vm bayrağı iletilirse pVM oluşturma sırasında bunu, pVM ürün yazılımı için uygun miktarda belleği sorgulamak ve ayırmak ve ardından korumalı modu etkinleştirmek için 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 olarak 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 ürün 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 bilgisayarda boş bellek kalmamaya başlarsa işlemin sonlandırılmasına (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 gönderilir.

Normal KVM altında VMM, tüm konuk belleğine erişimi korur. pKVM ile konuk belleği, konuğa bağışlandığında ana bilgisayarın fiziksel adres alanından çıkarılır. Bunun tek istisnası, sanal cihazlar için olduğu 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 tuzağa düşürülür ve VM FD'de bir I/O olayıyla sonuçlanır. Bu mekanizma sanal cihazları uygulamak için kullanılır. Korumalı modda konuk, yanlışlıkla bilgi sızıntısı riskini azaltmak amacıyla adres alanının bir bölgesinin hiper çağrı kullanılarak 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 zamanlanır. İş parçacığı, vCPU FD'de KVM_RUN ioctl'yi çağırır ve hiper yöneticinin konuk vCPU bağlamına geçmesine neden olur. Ana bilgisayar planlayıcısı, konuk bağlamında harcanan süreyi ilgili vCPU iş parçacığının kullandığı süre olarak hesaba katar. KVM_RUN G/Ç, kesinti sonu veya vCPU'nun durdurulması gibi VMM tarafından işlenmesi gereken bir olay olduğunda geri döner. VMM olayı yönetir ve KVM_RUN tekrar çağırır.

KVM_RUN sırasında iş parçacığı, öncelikli olmayan EL2 hipervizör kodunun yürütülmesi dışında, ana bilgisayar zamanlayı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 QoS mekanizmalarına tabidirler. Spesifik olarak, her vCPU iş parçacığı fiziksel CPU'larla ilişkilendirilebilir, cpuset'lere yerleştirilebilir, kullanım sıkıştırma kullanılarak güçlendirilebilir veya sınırlandırı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 taşıma olarak
  • pl030 gerçek zamanlı saat (RTC)
  • Seri iletişim için 16550a UART

pVM ürün yazılımı

pVM ürün yazılımı (pvmfw), fiziksel bir aygıtı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 düzgün bir şekilde imzalandığı sürece pvmfw, Microdroid gibi belirli bir işletim sistemiyle 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 cihazın önyükleme prosedürüne aşağıdaki adım sırası eklenir:

  1. Android Önyükleyici (ABL), pvmfw'yi 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'nin sırlarının (CDI'ler) ölçümünü ve DICE türetilmesini gerçekleştirir ve bunları pvmfw ikili dosyasına ekler.
  4. ABL, DT'ye, pvmfw ikili dosyasının konumunu ve boyutunu ve önceki adımda türettiği sırları açıklayan bir linux,pkvm-guest-firmware-memory ayrılmış bellek bölgesi düğümü ekler.
  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 eşlemesini kaldırır ve cihazın çalışma süresi boyunca onu ana bilgisayardan (ve konuklardan) korur.

Cihaz önyüklemesinin ardından 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'nin (veya başka bir VMM'nin), hiper yönetici tarafından pvmfw görüntüsüyle doldurulacak yeterince büyük bir memslot oluşturması gerekir. VMM ayrıca başlangıç ​​değerini ayarlayabildiği kayıt listesiyle de sınırlıdır (birincil vCPU için x0-x14, ikincil vCPU'lar için yok). Kalan kayıtlar 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'nun kontrolünü pvmfw'ye devreder. Ü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 uzaklıklarda 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 veri yükünün giriş noktasına dallanır. Doğrulama adımlarından biri başarısız olursa ürün yazılımı bir PSCI SYSTEM_RESET hiper çağrısı düzenler.

Önyüklemeler arasında, pVM örneği hakkındaki bilgiler bir bölümde (virtio-blk cihazı) 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.