AVF mimarisi

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

Arka plan

Arm mimarisi, en az ayrıcalıklı olan istisna düzeyi 0 (EL0) ve en ayrıcalıklı olan istisna düzeyi 3 (EL3) olmak üzere en fazla dört istisna düzeyine 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ılan sistemin geri kalanı, EL1'de çalışan Linux çekirdeğidir.

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

Hipervizör

Korumalı çekirdek tabanlı sanal makine (pKVM), Linux KVM hiper yöneticisi üzerine kurulmuştur. Bu hiper yönetici, oluşturma sırasında "korumalı" olarak işaretlenen konuk sanal makinelerde çalışan yüklerin erişimini kısıtlama özelliğiyle genişletilmiştir.

KVM/arm64, belirli CPU özelliklerinin (ör. Virtualization Host Extensions (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, önyükleme sırasında hiper yönetici kodu çekirdek görüntüsünden ayrılır ve EL2'ye yüklenir. Çekirdek ise EL1'de çalışır. KVM'nin EL2 bileşeni, Linux kod tabanının bir parçası olsa da birden fazla EL1 arasında geçiş yapmaktan sorumlu küçük bir bileşendir. Hiper yönetici bileşeni Linux ile derlenir ancak vmlinux görüntüsünün ayrı ve özel bir bellek bölümünde bulunur. pKVM, hiper yönetici kodunu yeni özelliklerle genişleterek bu tasarımdan yararlanır. Bu sayede, Android ana makine çekirdeği ve kullanıcı alanı üzerinde kısıtlamalar uygulayabilir ve ana makine erişimini konuk belleği ve hiper yönetici ile sınırlandırabilir.

pKVM tedarikçi modülleri

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

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

Başlatma prosedürü

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

pKVM başlatma prosedürü

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

  1. Bootloader, EL2'de genel çekirdeğe girer.
  2. Genel çekirdek, EL2'de çalıştığını algılar ve pKVM ile modülleri EL2'de çalışmaya devam ederken kendisini EL1'e indirger. Ayrıca, pKVM tedarikçi 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 başlatılır. Bu noktada pKVM devreye girer ve 2. aşama sayfa tablolarını işler.

Başlatma prosedürü, yalnızca erken başlatma sırasında çekirdek görüntüsünün bütünlüğünü korumak için bootloader'a güvenir. Ayrıcalıkları kaldırılan çekirdek, artık hiper yönetici tarafından güvenilir olarak kabul edilmez. Bu durumda hiper yönetici, çekirdek tehlikeye girse bile kendisini korumakla yükümlüdür.

Android çekirdeğinin ve hipervizörün aynı ikili görüntüde bulunması, aralarında çok sıkı bir şekilde bağlı iletişim arayüzü olmasını sağlar. Bu sıkı bağlantı, iki bileşenin atomik güncellemelerini garanti eder. Bu sayede aralarındaki arayüzün sabit tutulmasına gerek kalmaz ve uzun vadeli sürdürülebilirlikten ödün vermeden büyük bir esneklik sunar. Sıkı bağlantı, her iki bileşen de hipervizörün sağladığı güvenlik garantilerini etkilemeden birlikte çalışabildiğinde performans optimizasyonlarına da olanak tanır.

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

CPU bellek erişimi koruması

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

2. aşama MMU, EL2 tarafından kontrol edilir ve 1. aşama MMU'nun çıkış adresinde ikinci bir adres çevirisinin uygulanmasını sağlar. Bu da fiziksel adres (PA) ile sonuçlanır. 2. aşama çeviri, 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ış adresine ara fiziksel adres (IPA) adı verilir. Not: Sanal adres (VA) önce IPA'ya, ardından PA'ya çevrilir.

CPU bellek erişimi koruması

Şekil 2. CPU bellek erişimi koruması

Geçmişte KVM, konukları çalıştırırken 2. aşama çeviri etkin, ana makine Linux çekirdeğini çalıştırırken ise 2. aşama devre dışı olarak çalışıyordu. Bu mimari, ana makine 1. aşama MMU'sundan gelen bellek erişimlerinin 2. aşama MMU'sundan geçmesine olanak tanır. Böylece ana makinenin konuk bellek sayfalarına sınırsız erişimi sağlanır. Diğer yandan pKVM, ana makine bağlamında bile 2. aşama korumayı etkinleştirir ve konuk bellek sayfalarını korumak için ana makine yerine hiper yöneticiyi görevlendirir.

KVM, konuklar için karmaşık IPA/PA eşlemeleri uygulamak üzere 2. aşamada adres çevirisinden tam olarak yararlanır. Bu sayede, fiziksel parçalanmaya rağmen konuklar için bitişik bellek yanılsaması oluşturulur. Ancak, düzenleyen için 2. aşama MMU'nun kullanımı yalnızca erişim kontrolüyle sınırlıdır. The host stage 2 is identity-mapped, ensuring that contiguous memory in the host IPA space is contiguous in the PA space. Bu mimari, sayfa tablosunda büyük eşlemelerin kullanılmasına olanak tanır ve sonuç olarak çeviri lookaside arabelleği (TLB) üzerindeki baskıyı azaltır. Kimlik eşleme PA tarafından dizine eklenebildiğinden, ana makine aşaması 2 de sayfa sahipliğini doğrudan sayfa tablosunda izlemek için kullanılır.

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

Daha önce açıklandığı gibi, konuk sayfalarının CPU sayfa tablolarındaki Linux ana makinesinden eşlemesinin kaldırılması, konuk belleğini korumak için gerekli ancak yeterli olmayan bir adımdır. pKVM'nin, ana makine çekirdeğinin kontrolü altındaki 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. Böyle bir cihazın misafir belleğine erişmesini önlemek için pKVM, Şekil 3'te gösterildiği gibi sistemdeki her DMA özellikli cihaz için giriş/çıkış bellek yönetimi birimi (IOMMU) donanımı gerektirir.

Dma bellek erişimi koruması

Şekil 3. DMA bellek erişimi koruması

IOMMU donanımı, en azından bir cihazın sayfa ayrıntı düzeyinde fiziksel belleğe okuma/yazma erişimi vermesini ve bu erişimi iptal etmesini sağlar. Ancak bu IOMMU donanımı, kimlik eşlemeli 2. aşama varsaydıkları için pVM'lerdeki cihazların kullanımını sınırlar.

Sanal makineler arasında izolasyon 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 tabloları kümesi kullanılabilir.

Ayrıca, 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şıdır. Bu sorunu azaltmak için EL1'deki ana makine, güç yönetimi, başlatma ve uygun olduğunda kesme işleme gibi yardımcı IOMMU yönetim görevlerinden sorumludur.

Ancak, cihaz durumunun kontrolünü ana makineye bırakmak, izin kontrollerinin başka yollarla (ör. cihaz sıfırlandıktan sonra) atlanamayacağından emin olmak için IOMMU donanımının programlama arayüzüne ek gereksinimler getirir.

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

Bellek sahipliği

Açılış sırasında, hipervizör dışı tüm belleklerin ana makineye ait olduğu varsayılır ve hipervizör tarafından bu şekilde izlenir. Bir pVM oluşturulduğunda ana makine, başlatılmasına izin vermek için bellek sayfaları bağışlar ve hiper yönetici, bu sayfaların sahipliğini ana makineden pVM'ye geçirir. Bu nedenle, hiper yönetici, ana makinenin 2. aşama sayfa tablosunda erişim kontrolü kısıtlamaları uygulayarak ana makinenin sayfalara tekrar erişmesini engeller ve konuğa gizlilik sağlar.

Ana makine ile konuklar arasındaki iletişim, aralarında kontrollü bellek paylaşımı sayesinde mümkün olur. Konuklar, hiper yöneticiye bu sayfaları ana makine aşaması 2 sayfa tablosunda yeniden eşlemesini söyleyen bir hiper çağrı kullanarak sayfalarının bir kısmını ana makineyle paylaşabilir. Benzer şekilde, ana makinenin TrustZone ile iletişimi, bellek paylaşımı ve/veya ödünç verme işlemleriyle mümkün olur. Bunların tümü, Arm için Firmware Framework (FF-A) spesifikasyonu kullanılarak pKVM tarafından yakından izlenir ve kontrol edilir.

pVM'nin bellek gereksinimleri zaman içinde değişebileceğinden, arayan tarafa ait belirtilen sayfaların sahipliğinin ana makineye geri verilmesine olanak tanıyan bir hiper çağrı sağlanır. Uygulamada bu hiperçağrı, VMM'nin pVM'den kontrollü bir şekilde bellek istemesine ve pVM'nin VMM'yi bırakılan sayfalar konusunda bilgilendirmesine olanak tanımak için virtio balon protokolüyle birlikte kullanılır.

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

Ana makine, hiper yönetici tarafından erişilemez hale getirilen sayfalara erişmeye çalışmadığından emin olmalıdır. Yasa dışı bir ana makine erişimi, hiper yönetici tarafından ana makineye eşzamanlı bir istisnanın yerleştirilmesine neden olur. Bu durum, sorumlu kullanıcı alanı görevine bir SEGV sinyali gönderilmesine veya ana makine çekirdeğinin kilitlenmesine yol açabilir. 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 getirilir.

Kesme işleme ve zamanlayıcılar

Kesintiler, konukların cihazlarla etkileşim kurma şeklinin ve işlemciler arası kesintilerin (IPI'ler) ana iletişim mekanizması olduğu işlemciler arasındaki iletişimin önemli bir parçasıdır. KVM modeli, tüm sanal kesme yönetimi işlevlerini EL1'deki ana makineye devretmek için kullanılır. 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 kodu kapsamında işlenir.

GICv3 desteği

EL1 ile EL2 arasındaki arayüz, kesmelerle ilgili hiper yönetici kayıtlarının kopyaları da dahil olmak üzere tam kesme durumunun EL1 ana makinesine görünür olmasını 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 kayıt çalışma zamanı destek kodu, yalnızca Yazılımla Oluşturulan Kesme Kaydı (SGIR) ve Kesme Kaydını Devre Dışı Bırakma (DIR) kaydı yakalamayı destekleyecek şekilde basitleştirilebilir. Mimari, bu kayıtların her zaman EL2'ye yönlendirilmesini zorunlu kılar. Diğer yönlendirmeler ise şu ana kadar yalnızca hataları azaltmak için kullanılmıştır. Diğer her şey donanımda işlenir.

MMIO tarafında ise her şey EL1'de emüle edilir ve KVM'deki mevcut altyapının tamamı yeniden kullanılır. Son olarak, KVM'nin kullandığı temel planlama öğelerinden biri olduğundan kesme için bekleme (WFI) her zaman EL1'e iletilir.

Zamanlayıcı desteği

Sanal zamanlayıcının karşılaştırıcı değeri, her bir WFI yakalama işleminde EL1'e sunulmalıdır. Böylece EL1, vCPU engellendiğinde zamanlayıcı kesmelerini ekleyebilir. Fiziksel zamanlayıcı tamamen taklit edilir ve tüm tuzaklar EL1'e iletilir.

MMIO işleme

Sanal makine izleyici (VMM) ile iletişim kurmak ve GIC emülasyonu gerçekleştirmek için MMIO tuzaklarının daha fazla triyaj için EL1'de ana makineye geri iletilmesi gerekir. pKVM için aşağıdakiler gereklidir:

  • IPA ve erişimin boyutu
  • Yazma işlemindeki veriler
  • Yakalanma noktasındaki CPU'nun endianness'ı

Ayrıca, kaynak/hedef olarak genel amaçlı bir kayıt (GPR) içeren tuzaklar, soyut bir aktarım sahte kaydı kullanılarak iletilir.

Konuk arayüzleri

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

Genel hiperçağrılar

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

pKVM hiperçağrıları

  • Belleği düzenleyen kullanıcıyla paylaşma Tüm konuk belleğine başlangıçta ana makine erişemez ancak paylaşılan bellek iletişimi ve paylaşılan arabellekleri kullanan sanallaştırılmış cihazlar için ana makine erişimi gereklidir. Sayfaları ana makineyle paylaşma ve paylaşımı kaldırma için kullanılan hiper çağrılar, konuğun el sıkışmaya gerek kalmadan belleğin hangi bölümlerinin Android'in geri kalanına erişilebilir olacağına tam olarak karar vermesini sağlar.
  • Belleğin ana makineye bırakılması. Konuk belleği, yok edilene kadar genellikle konuğa aittir. Bu durum, zaman içinde değişen bellek gereksinimlerine sahip uzun ömürlü sanal makineler için yetersiz olabilir. relinquish Hiper çağrı, konuğun sayfaların sahipliğini konuk sonlandırması gerekmeden açıkça ana makineye geri 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 emüle edilir. Bu işleme yardımcı olmak için pKVM'nin, hataya neden olan talimatla ilgili ayrıntıları (ör. adresi, kayıt parametreleri ve olası içerikleri) ana makineye geri bildirmesi gerekir. Bu durumda, tuzak beklenmedik bir şekilde tetiklenirse korumalı bir konuktan gelen hassas veriler istemeden açığa çıkabilir. pKVM, konuk daha önce hataya neden olan IPA aralığını ana makineye geri tuzaklanmaya izin verilen bir aralık olarak tanımlamak için bir hiper çağrı yayınlamadığı sürece bu hataları ölümcül olarak ele alarak bu sorunu çözer. Bu çözüme MMIO koruması denir.

Sanal G/Ç cihazı (virtio)

Virtio, sanallaştırılmış cihazları uygulamak ve bunlarla etkileşim kurmak için popüler, taşınabilir ve olgun bir standarttır. Korunan konuklara sunulan cihazların çoğu virtio kullanılarak uygulanır. Virtio, korumalı bir misafir ile Android'in geri kalanı arasındaki iletişim için kullanılan vsock uygulamasının da temelini oluşturur.

Virtio cihazları genellikle VMM tarafından ana makinenin kullanıcı alanında uygulanır. VMM, konuktan virtio cihazının MMIO arayüzüne yapılan yakalanmış bellek erişimlerini engeller ve beklenen davranışı taklit eder. MMIO erişimi, cihaza her erişim için VMM'ye gidiş-dönüş yapılması gerektiğinden nispeten maliyetlidir. Bu nedenle, cihaz ile konuk arasındaki gerçek veri aktarımının çoğu, bellekteki bir dizi virtqueue kullanılarak gerçekleştirilir. Virtio'nun temel varsayımı, ana makinenin konuk belleğine rastgele erişebileceğidir. Bu varsayım, cihaz emülasyonunun doğrudan erişmesi amaçlanan konukta arabellek işaretçileri içerebilecek virtqueue'nun tasarımında açıkça görülmektedir.

Daha önce açıklanan bellek paylaşımı hiperçağrıları, konuktan ana makineye virtio 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ın boyutundan küçükse gerekenden daha fazla veri açığa çıkarabilir. Bunun yerine, konuk, hem virtqueues'ları hem de bunlara karşılık gelen veri arabelleklerini paylaşılan belleğin sabit bir penceresinden ayıracak şekilde yapılandırılır. Veriler gerektiğinde pencereye ve pencereden kopyalanır (yansıtılır).

Sanal cihaz

Şekil 4. Virtio cihazı

TrustZone ile etkileşim

Konuklar TrustZone ile doğrudan etkileşimde bulunamasa da toplantı sahibi, güvenli dünyaya SMC çağrıları gönderebilmelidir. Bu çağrılar, ana makine tarafından erişilemeyen, fiziksel olarak adreslenmiş bellek arabelleklerini belirtebilir. Güvenli yazılım genellikle arabelleğin erişilebilirliğinin farkında olmadığından kötü amaçlı bir ana makine, bu arabelleği kullanarak karışık temsilci saldırısı (DMA saldırısına benzer) gerçekleştirebilir. Bu tür saldırıları önlemek için pKVM, tüm ana makine SMC çağrılarını EL2'ye yönlendirir ve EL3'teki ana makine ile 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 net bir ifadeyle, çevrimiçi olan veya askıya alma işleminden devam eden bir CPU'nun giriş noktası, 2. aşama sayfa tablosu EL1'de ana bilgisayara dönmeden önce EL2'ye yüklenecek şekilde 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 güncel bir TF-A sürümü kullanılarak SoC'nin PSCI'yi desteklemesine dayanır.

Arm için Firmware Framework (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 bölümü, hem ortak bir mesaj biçimi hem de temel sayfalar için iyi tanımlanmış bir izin modeli kullanarak güvenli dünyayla belleği paylaşmaya yönelik bir mekanizma tanımlar. pKVM, ana makinenin yeterli izne sahip olmadığı güvenli tarafla belleği paylaşmaya çalışmadığından emin olmak için FF-A mesajlarını proxy'ler.

Bu mimar, güvenilir uygulamaların ve güvenli dünyada çalışan diğer yazılımların yalnızca güvenli dünyaya özel olarak ait olan veya FF-A kullanılarak güvenli dünya ile açıkça paylaşılan belleğe erişebilmesini sağlamak için bellek erişim modelini zorunlu kılan güvenli dünya yazılımına dayanır. S-EL2'nin bulunduğu 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'nin bulunmadığı bir sistemde TEE, bunun yerine 1. aşama sayfa tabloları aracılığıyla bir bellek erişim modeli uygulayabilir.

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. Güvenli donanım yazılımının (mutlaka güvenilir) pVM izolasyonunu korumak için gereken önlemleri anladığı için işlenmemiş SMC'leri güvenli bir şekilde işleyebileceği varsayılır.

Sanal makine izleyicisi

crosvm, sanal makineleri Linux'un KVM arayüzü üzerinden çalıştıran bir sanal makine izleyicisidir (VMM). Crosvm'yi benzersiz kılan, Rust programlama dilinin kullanılması ve ana makine çekirdeğini korumak için sanal cihazların etrafında bir korumalı alan oluşturulmasıyla güvenliğe odaklanmasıdır. Crosvm hakkında daha fazla bilgi için resmi belgeleri burada bulabilirsiniz.

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

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

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

Her crosvm işlemi, sanal makinenin tam olarak bir örneğini çalıştırır. Bu işlem, pVM ioctl'leri yayınlamak için kullanılabilecek bir VM dosya tanımlayıcısı oluşturmak üzere KVM_CREATE_VM sistem ioctl'sini kullanır. Bir sanal makine FD'sinde KVM_CREATE_VCPU veya KVM_CREATE_DEVICE ioctl, 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'ler, bir sanal makine FD'sindeki 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.

Dahili olarak crosvm, sanal makinenin dosya tanımlayıcılarını kenardan tetiklenen epoll arayüzünü kullanarak çekirdeğe kaydeder. Ardından çekirdek, dosya tanımlayıcılarından herhangi birinde yeni bir olay beklediğinde crosvm'yi 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 iletilirse pVM oluşturma sırasında bunu kullanarak pVM donanım yazılımı için uygun miktarda belleği sorgular ve ayırır, ardından korumalı modu etkinleştirir.

Bellek ayırma

VMM'nin temel sorumluluklarından biri, VM'nin 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
Bootloader 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 adı verilen 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 atfedilir ve ana makinenin boş belleği tükenmeye başlarsa işlemin sonlandırılmasına (sanal makinenin sonlandırılması) neden olabilir. Bir sanal makine durdurulduğunda bellek, hiper yönetici tarafından otomatik olarak silinir ve ana makine çekirdeğine döndürülür.

Normal KVM'de VMM, tüm konuk belleğine erişimi korur. pKVM ile konuk belleği, konuğa bağışlandığında ana makinenin fiziksel adres alanından eşlenmemiş olur. Bunun tek istisnası, misafir tarafından açıkça geri paylaşılan belleklerdir (ör. virtio cihazları için).

Konuğun adres alanındaki MMIO bölgeleri eşlenmemiş olarak bırakılır. Konuk tarafından bu bölgelere erişim 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, adres alanının bir bölgesinin MMIO için kullanıldığını bir hiper çağrı kullanarak onaylamalıdır. Bu, yanlışlıkla bilgi sızıntısı riskini azaltır.

Planlama

Her sanal CPU, bir POSIX iş parçacığıyla temsil edilir ve ana makine Linux zamanlayıcısı tarafından planlanır. İş parçacığı, vCPU FD'de KVM_RUN ioctl'u çağırır. Bu da hipervizörün konuk vCPU bağlamına geçmesine neden olur. Toplantıyı planlayan kullanıcının zamanlayıcısı, konuk bağlamında harcanan süreyi ilgili vCPU iş parçacığı tarafından kullanılan süre olarak değerlendirir. Giriş/çıkış, kesintinin sonu veya sanal CPU'nun durdurulması gibi VMM tarafından işlenmesi gereken bir etkinlik olduğunda KVM_RUN döndürülür. VMM, etkinliği işler ve KVM_RUN işlevini tekrar çağırır.

KVM_RUN sırasında, EL2 hiper yönetici kodunun yürütülmesi hariç olmak üzere iş parçacığı, ana makine zamanlayıcısı tarafından öncelikli olarak yürütülmeye devam eder. EL2 hiper yönetici kodu öncelikli olarak yürütülemez. Konuk pVM'nin kendisinde bu davranışı kontrol etme mekanizması yoktur.

Tüm vCPU iş parçacıkları diğer kullanıcı alanı görevleri gibi planlandığından tüm standart hizmet kalitesi mekanizmalarına tabidir. Daha net bir ifadeyle, her vCPU iş parçacığı fiziksel CPU'lara bağlanabilir, CPU kümelerine yerleştirilebilir, kullanım sınırlaması kullanılarak artırılabilir veya sınırlandırılabilir, önceliği/planlama politikası değiştirilebilir ve daha birçok işlem yapılabilir.

Sanal cihazlar

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

  • Bileşik disk görüntüleri için virtio-blk, salt okunur veya okuma/yazma
  • Ana makineyle iletişim için vhost-vsock
  • virtio-pci, virtio aktarımı olarak
  • pl030 real time clock (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, bir pVM tarafından yürütülen ilk koddur. pvmfw'nin temel 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 belirli bir işletim sistemiyle sınırlı değildir.

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

Cihazı başlatma

Aşağıdaki adım sırası, pKVM özellikli bir cihazın başlatma prosedürüne 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) sırlarını (bileşik cihaz tanımlayıcılar (CDI'ler) ve DICE sertifika zinciri) bir güven kökünden alır.
  3. ABL, pvmfw için gerekli CDI'leri türetir ve bunları pvmfw ikilisine ekler.
  4. ABL, DT'ye linux,pkvm-guest-firmware-memory ayrılmış bellek bölgesi düğümü ekleyerek pvmfw ikilisinin konumunu ve boyutunu ve önceki adımda türetilen sırları 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 eşlemesini kaldırır ve cihazın çalışma süresi boyunca ana makineye (ve misafirlere) karşı korur.

Cihaz başlatıldıktan sonra Microdroid, Microdroid dokümanının Başlatma sırası bölümündeki adımlara göre başlatılır.

pVM başlatma

Bir pVM oluşturulurken crosvm (veya başka bir VMM), 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 ayarlayabileceği kayıt listesinde de kısıtlanmıştır (birincil vCPU için x0-x14, ikincil vCPU'lar için yok). Kalan kayıtlar ayrılmıştır ve hypervisor-pvmfw ABI'sinin bir parçasıdır.

pVM çalıştırıldığında hipervizör, birincil vCPU'nun kontrolünü önce pvmfw'ye devreder. Donanım yazılımı, crosvm'nin AVB imzalı bir çekirdek (bootloader veya başka bir görüntü olabilir) ve bilinen ofsetlerde belleğe imzalanmamış 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 donanım yazılımı bir PSCI SYSTEM_RESET hiper çağrısı yayınlar.

Önyüklemeler 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ı için pvmfw'nin gizli anahtarıyla şifrelenir.