AVF mimarisi

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

Arka plan

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

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

Hipervizör

Korunan çekirdek tabanlı sanal makine (pKVM), oluşturulurken "korunan" olarak işaretlenen konuk sanal makinelerde çalışan yüklere erişimi kısıtlama özelliğiyle genişletilmiş Linux KVM hipervizörü üzerine kuruludur.

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

pKVM tedarikçi firma modülleri

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

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

Başlatma prosedürü

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

pKVM önyükleme prosedürü

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

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

Başlatma prosedürü, çekirdek imajının bütünlüğünü yalnızca erken başlatma sırasında korumak için önyükleyiciye güvenir. Çekirdek ayrıcalıklarından mahrum bırakıldığında artık hipervizör tarafından güvenilir olarak kabul edilmez. Bu durumda, çekirdeğin güvenliği ihlal edilse bile kendisini korumaktan hipervizör sorumlu olur.

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

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

CPU bellek erişimi koruması

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

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

CPU bellek erişimi koruması

Şekil 2. CPU bellek erişimi koruması

KVM, geçmişte konuklar çalışırken 2. aşama çevirisi etkin ve ana makine Linux çekirdeği çalışırken 2. aşama devre dışı olarak çalışır. Bu mimari, ana makine 1. aşama MMU'sundan gelen bellek erişimlerinin 2. aşama MMU'dan geçmesine olanak tanır. Böylece, ana makineden konuk bellek sayfalarına sınırsız erişim sağlanır. Öte yandan pKVM, ana makine bağlamında bile 2. aşama korumayı etkinleştirir ve ana makine yerine konuk bellek sayfalarını korumakla hipervizörü görevlendirir.

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

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

Daha önce açıklandığı gibi, misafir sayfalarının CPU sayfa tablolarındaki Linux ana makineden hariç tutulması, misafir belleğini korumak için gerekli ancak yeterli olmayan bir adımdır. pKVM'nin, ana makine çekirdeğinin kontrolü altında DMA özellikli cihazlar tarafından yapılan 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. Bu tür bir cihazın konuk belleğine erişmesini önlemek için pKVM, sistemdeki her DMA uyumlu cihaz için giriş/çıkış bellek yönetim birimi (IOMMU) donanımı gerektirir (Şekil 3'te gösterilmiştir).

Dma bellek erişimi koruması

Şekil 3. DMA bellek erişim koruması

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

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

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

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

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

Bellek sahipliği

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

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

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

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

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

Kesintileri işleme ve zamanlayıcılar

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

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

GICv3 desteği

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

Sistem kaydedicisi çalışma zamanı destek kodu, yalnızca Yazılım Tarafından Oluşturulan Kesme Kaydedicisi (SGIR) ve Kesme Kaydedicisini Devre Dışı Bırakma (DIR) kaydedicisi tuzağını destekleyecek şekilde basitleştirilebilir. Mimari, bu kaydedicilerin her zaman EL2'ye tuzak atmasını zorunlu kılar. Diğer tuzaklar ise şimdiye kadar yalnızca düzeltme notlarını azaltmak için yararlı olmuştur. Diğer her şey donanımda ele alınır.

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

Zamanlayıcı desteği

Sanal zamanlayıcının karşılaştırıcı değeri, her tuzak WFI'de EL1'e gösterilmelidir. Böylece EL1, vCPU engellenirken zamanlayıcı kesintileri enjekte edebilir. Fiziksel zamanlayıcı tamamen taklit edilir ve tüm tuzaklar EL1'e iletilir.

MMIO işleme

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

  • IPA ve erişimin boyutu
  • Yazma durumunda veriler
  • Tuzak noktasındaki CPU'nun büyük endianlığı

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

Misafir arayüzleri

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

Genel hiper çağrılar

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

pKVM hiper çağrıları

  • Anıları ev sahibiyle paylaşma. Ana makine, başlangıçta tüm konuk belleğine erişemez ancak paylaşılan bellek iletişimi ve paylaşılan arabellekleri kullanan para sanallaştırılmış cihazlar için ana makine erişimi gereklidir. Sayfaları ana makineyle paylaşma ve paylaşmamayı kaldırma için kullanılan hiper çağrılar, konuğun el sıkışma işlemine gerek kalmadan Android'in geri kalanının belleğin hangi bölümlerine erişebileceğine karar vermesine olanak tanır.
  • Ana makineye bellek bırakma. Tüm konuk bellekleri, silinene kadar genellikle konuğa aittir. Bu durum, zaman içinde değişen bellek gereksinimleri olan uzun ömürlü sanal makineler için yetersiz olabilir. relinquish hiperçağrısı, konuğun oturumunu kapatmadan sayfaların sahipliğini açıkça ana makineye aktarmasına olanak tanır.
  • Ana makineye bellek erişimi tuzağı. Geleneksel olarak, bir KVM konuğu geçerli bir bellek bölgesine karşılık gelmeyen bir adrese erişirse vCPU iş parçacığı ana makineye çıkar ve erişim genellikle MMIO için kullanılır ve kullanıcı alanında VMM tarafından taklit edilir. Bu işlemi kolaylaştırmak için pKVM'nin, hatalı talimatla ilgili ayrıntıları (ör. adresi, kayıt parametreleri ve muhtemelen içerikleri) ana makineye geri bildirmesi gerekir. Bu da, tuzak beklenmiyorsa korunan bir konuğun hassas verilerini istemeden açığa çıkarabilir. pKVM, konuk daha önce hatalı IPA aralığını, erişimlerin ana makineye geri tuzaklanmasına izin verilen bir alan olarak tanımlamak için bir hiper çağrı göndermediği sürece bu hataları kritik olarak ele alarak bu sorunu çözer. Bu çözüme MMIO koruması denir.

Sanal G/Ç cihazı (virtio)

Virtio, para-sanallaştırılmış cihazları uygulamak ve bu cihazlarla etkileşimde bulunmak için popüler, taşınabilir ve gelişmiş bir standarttır. Korunan konuklara sunulan cihazların çoğu virtio kullanılarak uygulanır. Virtio, korumalı bir konuk ile Android'in geri kalanı arasındaki iletişim için kullanılan vsock uygulamasının da temelini oluşturur.

Virtio cihazlar genellikle ana makinenin kullanıcı alanında VMM tarafından uygulanır. VMM, konuktan virtio cihazın MMIO arayüzüne gelen yakalanan bellek erişimlerini durdurur ve beklenen davranışı taklit eder. MMIO erişimi, cihaza her erişim için VMM'ye gidip gelme işlemi gerektirdiğinden nispeten pahalıdır. 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 temel varsayımlarından biri, ana makinenin misafir belleğine keyfi olarak erişebilmesidir. Bu varsayım, virtqueue'un tasarımında açıkça görülebilir. Bu tasarım, cihaz emülasyonunun doğrudan erişmesi amaçlanan misafirdeki arabelleğe işaretçiler içerebilir.

Daha önce açıklanan bellek paylaşımı hiper çağrıları, konuktaki sanal veri arabelleklerini ana makineye paylaşmak için kullanılabilir olsa da bu paylaşım zorunlu olarak sayfa ayrıntı düzeyinde gerçekleştirilir ve arabellek boyutu bir sayfanın boyutundan azsa gerekenden daha fazla veri gösterilebilir. Bunun yerine konuk, hem sanal sıraları hem de ilgili veri arabelleklerini sabit bir paylaşılan bellek aralığında olacak şekilde yapılandırılır. Veriler gerektiğinde pencereye ve pencereden kopyalanır (atlanır).

Sanal cihaz

Şekil 4. Virtio cihaz

TrustZone ile etkileşim

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

Ana makineden gelen PSCI çağrıları, minimum değişiklikle EL3 donanım yazılımına yönlendirilir. Daha açık belirtmek gerekirse, çevrimiçi olan veya askıya alma durumundan devam eden bir CPU'nun giriş noktası, 2. aşama sayfa tablosunun EL1'deki ana makineye dönmeden önce EL2'de yüklenmesi için yeniden yazılır. Bu koruma, önyükleme sırasında pKVM tarafından uygulanır.

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

Arm için Donanım Yazılımı Çerçevesi (FF-A), özellikle güvenli bir hipervizör varken normal ve güvenli dünyalar arasındaki etkileşimleri standart hale getirir. Spesifikasyonun büyük bir kısmı, hem ortak bir mesaj biçimi hem de temel sayfalar için iyi tanımlanmış bir izin modeli kullanarak belleği güvenli alanla paylaşma mekanizmasını tanımlar. pKVM, ana makinenin yeterli izinlere sahip olmadığı güvenli alanla bellek paylaşmaya çalışmamasını sağlamak için FF-A mesajlarını proxy'ler.

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

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

Sanal makine izleyici

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

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

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

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

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

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

pKVM, pVM ortamı hakkında bilgi edinmek ve bir sanal makine için korumalı modu ayarlamak üzere kullanılabilecek yeni bir özellik olan KVM_CAP_ARM_PROTECTED_VM ekler. crosvm, --protected-vm işareti iletildiyse pVM oluşturma sırasında bunu kullanarak pVM donanım yazılımı için uygun miktarda belleği sorgulayıp ayırır ve ardından korumalı modu etkinleştirir.

Bellek ayırma

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

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

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

Normal KVM'de VMM, tüm misafir belleğine erişmeye devam eder. pKVM ile, konuğa bağışlandığında konuk belleğinin ana makinenin fiziksel adres alanındaki eşlemesi kaldırılır. Bunun tek istisnası, konuk tarafından açıkça paylaşılan bellektir (ör. virtio cihazlar).

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

Planlama

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

KVM_RUN sırasında, EL2 hipervizör kodunun yürütülmesi hariç olmak üzere iş parçacığı ana makine planlayıcısı tarafından kesintiye uğratılabilir durumda kalır. Misafir sanal makinenin bu davranışı kontrol etmek için mekanizması yoktur.

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

Sanal cihazlar

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

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

pVM donanım yazılımı

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

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

Cihazın başlatılması

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

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

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

pVM önyüklemesi

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

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

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