بنية AVF

يوفّر Android التنفيذ المرجعي لجميع المكوّنات اللازمة لتنفيذ إطار عمل المحاكاة الافتراضية لنظام التشغيل Android. تقتصر طريقة التنفيذ هذه في الوقت الحالي على الطريقة ARM64. تشرح هذه الصفحة بنية إطار العمل.

معلومات أساسية

تسمح بنية "مجموعة ميزات AMP" بما يصل إلى أربعة مستويات استثناء، ويكون مستوى الاستثناء 0 (EL0) الأقل امتيازًا، والاستثناء 3 (EL3) الأعلى. ويتم تشغيل أكبر جزء من قاعدة رموز Android (جميع مكوّنات مساحة المستخدم) في EL0. باقي ما يُعرف باسم "Android" هي نواة Linux، والتي تعمل في EL1.

تسمح طبقة EL2 بإدخال برنامج Hypervisor (مراقب الأجهزة الظاهرية) الذي يعمل على عزل الذاكرة والأجهزة في أجهزة pVM فردية على EL1/EL0، مع تحقيق ضمانات قوية بالسرية والتكامل.

ميزة Hypervisor (مراقب الأجهزة الظاهرية)

تم تصميم الجهاز الافتراضي المحمي المستند إلى النواة (pKVM) استنادًا إلى جهاز Linux KVM Hypervisor، الذي تم توسيعه من خلال قدرته على تقييد الوصول إلى الحمولات التي تعمل في الأجهزة الافتراضية للضيوف والتي تم وضع علامة "محمية" عليها عند الإنشاء.

يتوافق KVM/arm64 مع أوضاع تنفيذ مختلفة بناءً على مدى توفُّر بعض ميزات وحدة المعالجة المركزية (CPU)، مثل إضافات مضيف المحاكاة الافتراضية (VHE) (ARMv8.1 والإصدارات الأحدث). في أحد هذه الأوضاع، والمعروفة عادةً باسم الوضع غير VHE، يتم تقسيم رمز الخوارزمية العابرة من صورة النواة أثناء التشغيل ويتم تثبيته في EL2، في حين يتم تشغيل النواة نفسها باستخدام EL1. على الرغم من كونه جزءًا من قاعدة رموز Linux، إلا أن مكوّن EL2 من KVM هو عنصر صغير مسؤول عن التبديل بين نماذج EL1 المتعددة. يتم تجميع مكوِّن Hypervisor باستخدام نظام التشغيل Linux، ولكنه يتوفّر في قسم ذاكرة منفصل ومخصَّص من صورة vmlinux. وتستفيد pKVM من هذا التصميم من خلال توسيع رمز برنامج Hypervisor (مراقب الأجهزة الظاهرية) من خلال ميزات جديدة تسمح له بفرض قيود على نواة مضيف Android ومساحة المستخدم، وتقييد إمكانية وصول المضيف إلى ذاكرة الضيف وبرنامج Hypervisor (مراقب الأجهزة الظاهرية).

وحدات مورّد أجهزة pKVM

وحدة مورد pKVM هي وحدة خاصة بالجهاز تحتوي على وظائف خاصة بالجهاز، مثل برامج تشغيل وحدة إدارة ذاكرة الإدخال والإخراج (IOMMU). تتيح لك هذه الوحدات نقل ميزات الأمان التي تتطلّب الوصول إلى أجهزة pKVM من المستوى 2 (EL2).

للتعرّف على طريقة تطبيق وحدة مورّد pKVM وتحميلها، يمكنك الاطّلاع على مقالة تطبيق وحدة مورّد pKVM.

إجراء التمهيد

ويوضّح الشكل التالي إجراء تشغيل pKVM:

إجراء تشغيل pKVM

الشكل 1. إجراء تشغيل pKVM

  1. يدخل برنامج الإقلاع في النواة العامة في EL2.
  2. ويكتشف النواة العامة أنّ الجهاز يعمل في EL2 ويحرم نفسه من EL1، بينما يستمر تشغيل pKVM ووحداته في EL2. بالإضافة إلى ذلك، يتم حاليًا تحميل وحدات مورّدي pKVM.
  3. تستمر النواة العامة في بدء التشغيل بشكل طبيعي، حيث تحمِّل جميع برامج تشغيل الأجهزة اللازمة إلى أن تصل إلى مساحة المستخدم. في هذه المرحلة، يكون pKVM في مكانه ويتعامل مع جداول صفحات المرحلة الثانية.

يثق إجراء التشغيل في برنامج الإقلاع بالحفاظ على سلامة صورة النواة (kernel) أثناء التشغيل المبكر فقط. عندما يتم حرمان النواة kernel، لا يعتبرها برنامج Hypervisor (مراقب الأجهزة الظاهرية) موثوقًا به، وبالتالي يكون مسؤولاً عن حماية نفسه حتى إذا تعرضت النواة للخطر.

يتيح وجود نواة Android وبرنامج Hypervisor (مراقب الأجهزة الظاهرية) في نفس الصورة الثنائية توفير واجهة اتصال مترابطة للغاية بينهما. ويضمن هذا الاقتران الدقيق إجراء تحديثات طفيفة للمكونين، مما يتجنب الحاجة إلى الحفاظ على الواجهة بينهما مستقرة، كما يوفر قدرًا كبيرًا من المرونة دون المساس بإمكانية الصيانة على المدى الطويل. كما يسمح الاقتران المحدود بتحسين الأداء عندما يمكن للمكونين التعاون دون التأثير على ضمانات الأمان التي يوفرها برنامج Hypervisor (مراقب الأجهزة الظاهرية).

علاوة على ذلك، يسمح استخدام GKI في منظومة Android المتكاملة تلقائيًا بنشر برنامج Hypervisor (مراقب الأجهزة الظاهرية) الخاص بـ pKVM على أجهزة Android بالبرنامج الثنائي نفسه مثل النواة.

حماية الوصول إلى ذاكرة وحدة المعالجة المركزية (CPU)

تحدد بنية Arm وحدة إدارة الذاكرة (MMU) مقسمة إلى مرحلتين مستقلتين، يمكن استخدام كلتيهما لتنفيذ ترجمة العنوان والتحكم في الوصول إلى أجزاء مختلفة من الذاكرة. يتم التحكم في المرحلة الأولى MMU بواسطة EL1 وتسمح بالمستوى الأول من ترجمة العناوين. يستخدم Linux المرحلة الأولى لإدارة مساحة العنوان الافتراضية المتوفرة لكل عملية في مساحة المستخدم ومساحة العنوان الافتراضية الخاصة به.

ويتحكم EL2 في المرحلة الثانية من MMU، وهي تتيح تطبيق ترجمة العنوان الثاني على عنوان الإخراج للمرحلة الأولى MMU، ما ينتج عنه عنوان فعلي (PA). ويمكن استخدام أداة الترجمة للمرحلة الثانية من قِبل برنامج Hypervisor (مراقب الأجهزة الظاهرية) للتحكم في عمليات الوصول إلى الذاكرة وترجمتها من جميع الأجهزة الافتراضية للضيوف. كما هو موضّح في الشكل 2، عند تفعيل كلتا مرحلتَي الترجمة، يُطلق على عنوان الإخراج في المرحلة 1 اسم عنوان مادي وسيط (IPA). ملاحظة: يُترجم العنوان الافتراضي (VA) إلى IPA ثم يُترجم إلى عنوان IP.

حماية الوصول إلى ذاكرة وحدة المعالجة المركزية (CPU)

الشكل 2. حماية الوصول إلى ذاكرة وحدة المعالجة المركزية (CPU)

سابقًا، كانت KVM تعمل مع تمكين ترجمة المرحلة الثانية أثناء تشغيل الضيوف ومع إيقاف المرحلة الثانية أثناء تشغيل نواة Linux للمضيف. وتتيح هذه البنية إمكانية الوصول غير المحدود من المضيف إلى صفحات ذاكرة الضيوف من خلال مرحلة MMU، وذلك من خلال المرحلة الثانية من MMU. ومن ناحية أخرى، يتيح pKVM حماية المرحلة الثانية حتى في سياق المضيف، ويضع برنامج Hypervisor (مراقب الأجهزة الظاهرية) مسؤولاً عن حماية صفحات ذاكرة الضيوف بدلاً من المضيف.

تستفيد KVM بشكل كامل من ترجمة العناوين في المرحلة الثانية لتنفيذ تعيينات IPA/PA المعقدة للضيوف، مما يخلق وهمًا بوجود ذاكرة متجاورة لدى الضيوف على الرغم من التجزئة المادية. ومع ذلك، يقتصر استخدام المرحلة الثانية من MMU للمضيف على التحكم في الوصول فقط. المرحلة الثانية للمضيف هي تعيين الهوية، لضمان أن تكون الذاكرة المجاورة في مساحة IPA للمضيف متجاورة في مساحة العنوان العام. وتتيح هذه البنية استخدام عمليات ربط كبيرة في جدول الصفحات، وبالتالي تقلِّل الضغط على المخزن المؤقت الخاص بالترجمة (TLB). وبما أنّه يمكن فهرسة عملية تحديد الهوية من خلال الإعلانات المخصّصة، يتم أيضًا استخدام مرحلة المضيف 2 لتتبُّع ملكية الصفحة مباشرةً في جدول الصفحات.

الحماية من الوصول المباشر إلى الذاكرة (DMA)

كما أوضحنا سابقًا، إنّ إلغاء ربط صفحات الضيوف من مضيف Linux في جداول صفحات وحدة المعالجة المركزية هو خطوة ضرورية لكنّها غير كافية لحماية ذاكرة الضيوف، ويحتاج pKVM أيضًا إلى الحماية من عمليات الوصول إلى الذاكرة التي تجريها الأجهزة المتوافقة مع منطقة السوق المحددة تحت سيطرة نواة المضيف واحتمال حدوث هجوم منطقة سوق محددة من قِبل مضيف ضار. ولمنع مثل هذا الجهاز من الوصول إلى ذاكرة الضيف، يتطلب pKVM جهاز وحدة إدارة ذاكرة إدخال وإخراج (IOMMU) لكل جهاز متوافق مع قانون الأسواق الرقمية في النظام، كما هو موضّح في الشكل 3.

الحماية من الوصول إلى الذاكرة باستخدام معيار Dma

الشكل 3. الحماية من الوصول إلى الذاكرة في منطقة السوق المحدّدة

كحد أدنى، يوفر جهاز IOMMU وسيلة منح وإبطال الوصول للقراءة/الكتابة للجهاز إلى الذاكرة الفعلية عند دقة الصفحة. ومع ذلك، يحدّ جهاز IOMMU هذا من استخدام الأجهزة في الأجهزة الافتراضية حيث تفترض المرحلة الثانية التي يتم تعيين الهوية لها.

لضمان العزلة بين الأجهزة الافتراضية، يجب أن يتم تمييز معاملات الذاكرة التي يتم إنشاؤها نيابةً عن الكيانات المختلفة بواسطة وحدة IOMMU حتى يمكن استخدام المجموعة المناسبة من جداول الصفحات للترجمة.

بالإضافة إلى ذلك، يُعد تخفيض مقدار الرموز البرمجية الخاصة بمنظومة المنظومة على الرقاقة (SoC) في EL2 استراتيجية رئيسية لتقليل قاعدة الحوسبة الشاملة الموثوق بها (TCB) لأجهزة pKVM وتتوافق مع تضمين برامج تشغيل IOMMU في برنامج Hypervisor (مراقب الأجهزة الظاهرية). وللتخفيف من حدة هذه المشكلة، يكون المضيف في EL1 مسؤولًا عن مهام إدارة IOMMU الإضافية، مثل إدارة الطاقة، والتهيئة، ومقاطعة المعالجة، حيثما كان ذلك مناسبًا.

ومع ذلك، يضع المضيف الذي يمكنه التحكّم في حالة الجهاز متطلبات إضافية على واجهة البرمجة لجهاز IOMMU لضمان عدم إمكانية تجاوز عمليات التحقّق من الأذونات بوسائل أخرى، مثل إعادة ضبط الجهاز.

تُعدّ بنية "وحدة إدارة ذاكرة نظام الذراع" (SMMU) إحدى الأدوات الأساسية المتوافقة مع تقنية IOMMU لأجهزة Arm التي تتيح استخدام كل من العزلة والتعيين المباشر. هذه البنية هي الحل المرجعي الموصى به.

ملكية الذاكرة

في وقت التشغيل، يُفترض أن تكون جميع الذاكرة غير تابعة لـ Hypervisor (مراقب الأجهزة الظاهرية) مملوكة للمضيف، ويتم تتبعها على هذا النحو بواسطة برنامج Hypervisor (مراقب الأجهزة الظاهرية). عند إنتاج جهاز افتراضي (pVM)، يتبرّع المضيف بصفحات الذاكرة للسماح بتشغيله، وينقل برنامج Hypervisor (مراقب الأجهزة الظاهرية) ملكية هذه الصفحات من المضيف إلى الجهاز الافتراضي (PVM). وبالتالي، يضع برنامج Hypervisor (مراقب الأجهزة الظاهرية) قيودًا على التحكم في الوصول في جدول صفحات المرحلة الثانية للمضيف لمنعه من الوصول إلى الصفحات مرة أخرى، مما يوفر السرية للضيف.

أصبح التواصل بين المضيف والضيوف ممكنًا من خلال مشاركة المعلومات المنظَّمة بينهم. يُسمح للمدعوين بمشاركة بعض صفحاتهم مرة أخرى مع المضيف باستخدام مكالمة فائقة الذي يوجه برنامج Hypervisor (مراقب الأجهزة الظاهرية) لإعادة تخصيص تلك الصفحات في جدول صفحات المرحلة الثانية الخاص بالمضيف. وبالمثل، يصبح تواصل المضيف مع TrustZone ممكنًا من خلال مشاركة الذاكرة و/أو عمليات الإقراض، وتراقب pKVM جميع هذه العمليات عن كثب وتتحكّم فيها باستخدام مواصفات إطار عمل البرامج الثابتة للذراع (FF-A).

وبما أنّ متطلبات ذاكرة الأجهزة الافتراضية قد تتغير بمرور الوقت، يتم توفير اتصال فائق يسمح باستعادة ملكية صفحات محددة تابعة للمتصل إلى المضيف. عمليًا، يتم استخدام هذا الطلب الفائق مع بروتوكول بالون virtio للسماح لـ VMM بطلب استعادة الذاكرة من جهاز افتراضي (PVM)، وإرسال إشعار إلى جهاز VMM للصفحات التي تم التخلي عنها، بطريقة خاضعة للرقابة.

يكون برنامج Hypervisor (مراقب الأجهزة الظاهرية) مسؤولًا عن تتبع ملكية جميع صفحات الذاكرة في النظام وما إذا كان تتم مشاركتها أو إعارتها لجهات أخرى. ويتم تنفيذ معظم عمليات تتبُّع الحالة هذه باستخدام البيانات الوصفية المرفقة بجداول الصفحات من المرحلة الثانية والخاصة بالمضيف والضيوف، باستخدام وحدات بت محجوزة في إدخالات جدول الصفحة (PTEs)، والتي تكون كما يوحي اسمها، محجوزة لاستخدام البرامج.

يجب أن يتأكد المضيف من أنه لا يحاول الوصول إلى الصفحات التي تعذَّر على برنامج Hypervisor (مراقب الأجهزة الظاهرية) الوصول إليها. يؤدي الوصول غير القانوني للمضيف إلى إدخال استثناء متزامن إلى المضيف من خلال برنامج Hypervisor (مراقب الأجهزة الظاهرية)، ما قد يؤدي إلى تلقّي مهمة مساحة المستخدم المسؤولة التي تتلقّى إشارة SEGV أو تعطُّل نواة المضيف. ولمنع الوصول غير المقصود، تصبح الصفحات التي تم التبرّع بها غير مؤهّلة للتبديل أو الدمج باستخدام نواة المضيف.

إيقاف عملية المناولة والموقّتات

تعد المقاطعات جزءًا أساسيًا من طريقة تفاعل الضيف مع الأجهزة وكذلك للاتصال بين وحدات المعالجة المركزية (CPU)، حيث تكون المقاطعات بين المعالجات (IPI) هي آلية الاتصال الرئيسية. ويتمثل نموذج KVM في تفويض جميع عمليات إدارة المقاطعات الافتراضية إلى المضيف في EL1، والذي يعمل لهذا الغرض كجزء من برنامج Hypervisor (مراقب الأجهزة الظاهرية) غير الموثوق به.

توفّر pKVM محاكاة كاملة للإصدار 3 من وحدة تحكّم المقاطعات العامة (GICv3) استنادًا إلى رمز KVM الحالي. ويتم التعامل مع الموقّت وبروتوكول IPI كجزء من رمز المحاكاة غير الموثوق به هذا.

دعم GICv3

يجب أن تضمن الواجهة بين EL1 وEL2 أن تكون حالة المقاطعة الكاملة مرئية لمضيف EL1، بما في ذلك نُسخ من سجلات برنامج Hypervisor (مراقب الأجهزة الظاهرية) المتعلقة بالمقاطعات. وعادةً ما يتم تحقيق مستوى الرؤية هذا باستخدام مناطق الذاكرة المشتركة، أي منطقة واحدة لكل وحدة معالجة مركزية افتراضية (vCPU).

يمكن تبسيط رمز دعم وقت تشغيل سجلّ النظام للتوافق فقط مع تسجيل المقاطعات التي يتم إنشاؤها للبرامج (SGIR) وإيقاف "إيقاف سجل المقاطعة" (DIR). تفرِض البنية أنّ هذه التسجيلات تلجأ دائمًا إلى EL2، في حين أنّ الفخاخ الأخرى كانت مفيدة حتى الآن للتخفيف من الأخطاء الخاطئة. وتتم معالجة كل شيء آخر في الأجهزة.

من ناحية MMIO، تتم محاكاة كل شيء في EL1، وبذلك تتم إعادة استخدام كل البنية الأساسية الحالية في KVM. أخيرًا، يتم دائمًا ترحيل WFI (WFI) إلى EL1، لأنّه أحد المبادئ الأساسية للجدولة التي تستخدمها KVM.

إتاحة الموقّت

يجب أن تتعرض قيمة المقارنة للموقّت الافتراضي لـ EL1 على كل معرّف Wi-Fi مصطنع كي يتمكن EL1 من إدخال مقاطعات للموقت أثناء حظر وحدة المعالجة المركزية الافتراضية. تتم محاكاة الموقّت بالكامل وإرسال جميع أجهزة رصد الصوت إلى EL1.

معالجة MMIO

للاتصال بشاشة الجهاز الافتراضية (VMM) وتنفيذ محاكاة GIC، يجب إعادة إرسال فخاخ MMIO إلى المضيف في EL1 لإجراء مزيد من عمليات الفرز، كما يتطلب pKVM ما يلي:

  • IPA وحجم الوصول
  • البيانات في حالة كتابة
  • مدى انتهاء معالجة وحدة المعالجة المركزية (CPU) عند نقطة التصادم

بالإضافة إلى ذلك، يتم ترحيل الفخاخ ذات الأهداف العامة (GPR) كمصدر/وجهة باستخدام تسجيل زائفة لنقل البيانات.

واجهات الضيوف

يمكن للضيف التواصل مع ضيف محمي باستخدام مجموعة من المكالمات الفائقة وإمكانية الوصول إلى الذاكرة في المناطق العالقة. تظهر المكالمات الفائقة وفقًا لمعيار SMCC، مع نطاق محجوز لتخصيص المورِّد بواسطة KVM. تعتبر المكالمات الفائقة التالية ذات أهمية خاصة لضيوف pKVM.

المكالمات الفائقة العامة

  • توفّر PSCI آلية للضيف تتيح للضيف التحكّم في مراحل نشاط وحدات المعالجة المركزية الافتراضية الخاصة به، بما في ذلك الإنشاء والوضع بلا اتصال بالإنترنت وإيقاف تشغيل النظام.
  • توفر TRNG آلية قياسية للضيف لطلب القصور من pKVM الذي ينقل الاتصال إلى EL3. وهذه الآلية مفيدة بشكل خاص في الحالات التي لا يمكن فيها الوثوق بالمضيف لإنشاء ظاهري لمنشئ الأرقام العشوائية (RNG).

مكالمات pKVM

  • جارٍ مشاركة الذاكرة مع المضيف. في البداية، يتعذّر على المضيف الوصول إلى ذاكرة الضيف بالكامل، ولكن يكون وصول المضيف ضروريًا للتواصل بين الذاكرة المشتركة والأجهزة الافتراضية التي تعتمد على مخازن مؤقتة مشتركة. تسمح المكالمات الفائقة لمشاركة الصفحات وإلغاء مشاركتها مع المضيف بتحديد أجزاء الذاكرة التي يمكن لبقية تطبيقات Android الوصول إليها بالضبط دون الحاجة إلى المصافحة.
  • التنازل عن الذاكرة للمضيف عادة ما تنتمي جميع ذاكرة الضيف إلى الضيف حتى يتم تلفه. وقد تكون هذه الحالة غير ملائمة للأجهزة الافتراضية طويلة الأجل التي لها متطلبات للذاكرة والتي تتفاوت بمرور الوقت. تسمح المكالمة الفائقة relinquish للضيف بنقل ملكية الصفحات بشكل صريح إلى المضيف بدون الحاجة إلى إنهاء الضيف.
  • توقُّف الوصول إلى الذاكرة للمضيف بشكل تقليدي، إذا وصل ضيف KVM إلى عنوان لا يتوافق مع منطقة ذاكرة صالحة، فإن سلسلة وحدة المعالجة المركزية الافتراضية يتم الخروج من وحدة المعالجة المركزية الافتراضية إلى المضيف ويتم عادة استخدام الوصول لاستخدام تقنية MMIO و محاكاتها عن طريق VMM في مساحة المستخدم. لتسهيل عملية المعالجة هذه، يجب على pKVM الإعلان عن تفاصيل التعليمات المتعلقة بالخطأ، مثل العنوان وتسجيل المعلمات ومن المحتمل أن تعيد المحتوى إلى المضيف، ما قد يؤدي بدون قصد إلى الكشف عن بيانات حساسة من ضيف محمي إذا لم يكن جهاز pKVM متوقَّعًا. ويحلّ pKVM هذه المشكلة من خلال التعامل مع هذه الأخطاء باعتبارها أخطاء قاتلة ما لم يصدِّر الضيف وسيلة استدعاء بروتوكول الإنترنت (IP) التي تمكّن العميل من الوصول إلى الجهاز المضيف لرصد الطلبات بدون قصد. ويُشار إلى هذا الحلّ باسم واقي MMIO.

جهاز إدخال/إخراج افتراضي (virtio)

Virtio هو معيار مشهور ومحمول ونضج لتطبيق الأجهزة الشبه الافتراضية والتفاعل معها. يتم تنفيذ غالبية الأجهزة التي تعرض للضيوف المحميين باستخدام virtio. يدعم Virtio أيضًا طريقة تنفيذ مقابل المستخدم للتواصل بين الضيف المحمي وبقية أجهزة Android.

يتم عادةً تنفيذ أجهزة Virtio في مساحة المستخدم على المضيف من خلال VMM، الذي يعترض عمليات الوصول العالقة إلى الذاكرة من الضيف إلى واجهة MMIO لجهاز virtio ويحاكي السلوك المتوقع. ويكون الوصول إلى تقنية MMIO مكلفًا نسبيًا لأن كل عملية وصول إلى الجهاز تتطلب الذهاب ذهابًا وإيابًا إلى VMM ثم الرجوع، ولذلك تتم معظم عمليات نقل البيانات الفعلية بين الجهاز والضيف باستخدام مجموعة من المزايا في الذاكرة. الافتراض الرئيسي لـ virtio هو أن المضيف يمكنه الوصول إلى ذاكرة الضيف بشكل عشوائي. يتجلى هذا الافتراض في تصميم قائمة الانتظار، والتي قد تحتوي على مؤشرات إلى الموارد الاحتياطية لدى الضيف بأن محاكاة الجهاز تهدف إلى الوصول مباشرةً.

وعلى الرغم من أنّه يمكن استخدام المكالمات الفائقة لمشاركة الذاكرة التي تم وصفها سابقًا لمشاركة المخازن المؤقتة لبيانات virtio من الضيف مع المضيف، يتم تنفيذ هذه المشاركة بدقة الصفحة وقد ينتج عنها عرض بيانات أكثر مما هو مطلوب إذا كان حجم المخزن المؤقت أقل من حجم الصفحة. بدلاً من ذلك، يتم ضبط الضيف لتخصيص كل من الفوائد ومخازن البيانات الاحتياطية المقابلة من نافذة ثابتة من الذاكرة المشتركة، مع نسخ البيانات (ارتداد) إلى النافذة ومنها حسب الحاجة.

جهاز افتراضي

الشكل 4. جهاز Virtio

التفاعل مع TrustZone

على الرغم من أنّه يتعذّر على الضيوف التفاعل مباشرةً مع TrustZone، يجب أن يظل المضيف قادرًا على إرسال مكالمات SMC في العالم الآمن. يمكن لهذه الاتصالات تحديد مخازن الذاكرة المؤقتة التي لا يمكن للمضيف الوصول إليها. ونظرًا لأن البرامج الآمنة لا تكون على دراية عمومًا بإمكانية الوصول إلى المخزن الاحتياطي، يمكن لمضيف ضار استخدام هذا المورد الاحتياطي لتنفيذ هجوم مرتبك على أحد الوسيطات (مثل هجوم منطقة السوق المحددة). لمنع مثل هذه الهجمات، ترصد pKVM جميع طلبات SMC المُضيفة إلى EL2 وتعمل كخادم وكيل بين المضيف والشاشة الآمنة في EL3.

تتم إعادة توجيه طلبات PSCI الواردة من المضيف إلى البرامج الثابتة EL3 مع إجراء أقل قدر من التعديلات. على وجه التحديد، تتم إعادة كتابة نقطة دخول وحدة المعالجة المركزية التي تتصل بالإنترنت أو تستأنف من التعليق بحيث يتم تثبيت جدول صفحات المرحلة الثانية في EL2 قبل العودة إلى المضيف في EL1. أثناء التشغيل، يتم فرض هذه الحماية بواسطة pKVM.

تعتمد هذه البنية على المنظومة على الرقاقة (SoC) التي تتوافق مع PSCI، ويُفضَّل أن يتم ذلك من خلال استخدام إصدار حديث من TF-A كبرامج EL3 الثابتة.

يوحّد إطار عمل البرامج الثابتة للذراع (FF-A) التفاعلات بين العوالم العادية والآمنة، لا سيما في حال توفُّر برنامج Hypervisor آمن. ويحدِّد جزء رئيسي من المواصفات آلية لمشاركة الذاكرة مع العالم الآمن، وذلك باستخدام تنسيق رسالة مشترك ونموذج أذونات محدّد جيدًا للصفحات الأساسية. يعمل pKVM على إنشاء رسائل FF-A للتأكّد من أنّ المضيف لا يحاول مشاركة الذاكرة مع الجانب الآمن الذي لا تتوفّر لديه الأذونات الكافية له.

تعتمد هذه البنية على برامج العالم الآمن التي تفرض نموذج الوصول إلى الذاكرة لضمان وصول التطبيقات الموثوق بها وأي برامج أخرى تعمل في العالم الآمن إلى الذاكرة فقط إذا كانت مملوكة بشكل حصري للعالم الآمن أو تمت مشاركتها صراحةً باستخدام أداة FF-A. وفي النظام الذي يستخدم S-EL2، يجب أن يتم فرض نموذج الوصول إلى الذاكرة من خلال نظام إدارة الأقسام الآمنة (SPMC)، مثل Hafnium، الذي يحافظ على جدولَي صفحات من المرحلة الثانية للعالم الآمن. وعلى أي نظام بدون S-EL2، يمكن لبيئة التنفيذ الموثوقة (TEE) فرض نموذج الوصول إلى الذاكرة من خلال جداول الصفحات ضمن المرحلة 1.

إذا لم تكن مكالمة SMC إلى EL2 هي مكالمة PSCI أو رسالة محدّدة مع FF-A، تتم إعادة توجيه مكالمات SMC التي لم تتم معالجتها إلى EL3. والافتراض هو أنّ البرامج الثابتة الآمنة (الموثوق بها بالضرورة) يمكنها التعامل بأمان مع الأجهزة الجوّالة للمؤسسات (SMC) التي لم تتم معالجتها، وذلك لأنّ البرامج الثابتة تدرك الاحتياطات اللازمة للحفاظ على عزل الأجهزة الافتراضية.

شاشة الجهاز الافتراضي

crosvm هي شاشة جهاز افتراضي (VMM) تعمل على تشغيل الأجهزة الظاهرية من خلال واجهة KVM في Linux. ما يميّز crosvm هو تركيزه على الأمان باستخدام لغة البرمجة Rust ووضع حماية حول الأجهزة الافتراضية لحماية نواة المضيف. لمزيد من المعلومات حول crosvm، يمكنك الاطلاع على مستنداتها الرسمية هنا.

أدوات وصف الملفات وإظهارها

تعرض KVM جهاز الأحرف /dev/kvm إلى مساحة المستخدم باستخدام ioctls التي تشكل واجهة برمجة التطبيقات KVM API. تنتمي الأزهار إلى الفئات التالية:

  • تطلب ioctls النظام وتعيِّن السمات العامة التي تؤثر في النظام الفرعي KVM بالكامل، وتنشئ أجهزة pVM.
  • تبحث VM ioctls وتضبط السمات التي تنشئ وحدات معالجة مركزية افتراضية (vCPU) وأجهزة، وتؤثِّر في أداء الجهاز الافتراضي (pVM) بالكامل، مثل تنسيق الذاكرة وعدد وحدات المعالجة المركزية الافتراضية (vCPU) والأجهزة.
  • تطلب وحدة المعالجة المركزية الافتراضية ioctls وتضبط السمات التي تتحكّم في تشغيل وحدة معالجة مركزية افتراضية واحدة.
  • تبحث ioctls في الجهاز وتعيِّن السمات التي تتحكم في تشغيل جهاز افتراضي واحد.

وتشغل كل عملية crosvm مثيلاً واحدًا فقط من آلة افتراضية. تستخدِم هذه العملية واجهة برمجة التطبيقات KVM_CREATE_VM لإنشاء واصف لملف الجهاز الافتراضي الذي يمكن استخدامه لإصدار أوامر pVM. تعمل ioctl KVM_CREATE_VCPU أو KVM_CREATE_DEVICE على VM FD على إنشاء وحدة معالجة مركزية افتراضية/جهاز وعرض واصف ملف يشير إلى المورد الجديد. يمكن استخدام ioctls على وحدة المعالجة المركزية الافتراضية أو FD على الجهاز للتحكّم في الجهاز الذي تم إنشاؤه باستخدام القارئ على جهاز افتراضي (VM FD). بالنسبة لوحدات المعالجة المركزية الافتراضية، يتضمن ذلك المهمة المهمة لتشغيل رمز الضيف.

ويسجِّل crosvm واصفات ملفات الجهاز الافتراضي في النواة باستخدام واجهة epoll التي يتم تشغيلها على الحافة. بعد ذلك تُعلم النواة crosvm متى كان هناك حدث جديد معلق في أي من واصفات الملفات.

تضيف pKVM إمكانية جديدة، وهي KVM_CAP_ARM_PROTECTED_VM، يمكن استخدامها للحصول على معلومات عن بيئة pVM وإعداد الوضع المحمي للجهاز الافتراضي (VM). يستخدم Crosvm هذه الإمكانية أثناء إنشاء جهاز افتراضي (pVM) في حال تمرير علامة --protected-vm، للاستعلام عن حجم الذاكرة المناسب لبرامج PVM الثابتة وحجزها، ثم تفعيل "الوضع المحمي".

تخصيص الذاكرة

تتمثل إحدى المسؤوليات الرئيسية لـ VMM في تخصيص ذاكرة الجهاز الافتراضي وإدارة تنسيق الذاكرة. وينشئ crosvm تنسيقًا ثابتًا للذاكرة يتم وصفه بشكل غير دقيق في الجدول أدناه.

نقل البيانات (FDT) في الوضع العادي PHYS_MEMORY_END - 0x200000
إخلاء مساحة ...
رامديسك ALIGN_UP(KERNEL_END, 0x1000000)
Kernel 0x80080000
برنامج إقلاع 0x80200000
بروتوكول FDT في وضع BIOS 0x80000000
قاعدة ذاكرة فعلية 0x80000000
البرامج الثابتة لأجهزة pVM 0x7FE00000
ذاكرة الجهاز 0x10000 - 0x40000000

يتم تخصيص الذاكرة المادية مع mmap ويتم تخصيص هذه الذاكرة للجهاز الافتراضي لملء مناطق الذاكرة التي يُطلق عليها اسم memslots، باستخدام KVM_SET_USER_MEMORY_REGION ioctl. وبالتالي، تُنسب جميع ذاكرة pVM الضيف إلى مثيل crosvm الذي يديرها، ويمكن أن يؤدي إلى إنهاء العملية (إنهاء الجهاز الافتراضي) إذا بدأ المضيف في نفاد الذاكرة. عند إيقاف جهاز افتراضي (VM)، يتم محو الذاكرة تلقائيًا من خلال برنامج Hypervisor (مراقب الأجهزة الظاهرية) وتتم إعادتها إلى نواة المضيف.

ضمن KVM العادي، يحتفظ VMM بإمكانية الوصول إلى ذاكرة جميع الضيوف. باستخدام pKVM، لا يتم تعيين ذاكرة الضيف من مساحة العنوان الفعلي للمضيف عندما يتم تخصيصه للضيف. الاستثناء الوحيد هو الذاكرة التي شاركها الضيف بصراحة، مثل أجهزة virtio.

يتم ترك مناطق MMIO في مساحة عنوان المدعو بدون تعيين. يحجز الضيف إمكانية وصوله إلى هذه المناطق، ما يؤدي إلى إقامة حدث I/O على الجهاز الافتراضي (VM FD). ويتم استخدام هذه الآلية لتطبيق الأجهزة الافتراضية. في "الوضع المحمي"، يجب أن يقرّ الضيف بأنّه يتم استخدام منطقة من مساحة العنوان الخاصة به في MMIO باستخدام مكالمة فائقة، وذلك للحد من خطر تسرُّب المعلومات غير المقصود.

الجدولة

يتم تمثيل كل وحدة معالجة مركزية افتراضية بسلسلة POSIX ويتم جدولتها بواسطة المضيف في نظام جدولة Linux. تطلب سلسلة التعليمات ioctl KVM_RUN على وحدة المعالجة المركزية الافتراضية (vCPU FD)، ما يؤدي إلى تبديل برنامج Hypervisor (مراقب الأجهزة الظاهرية) إلى سياق وحدة المعالجة المركزية الافتراضية للضيوف. تحتسب أداة جدولة المضيف الوقت المستغرَق في سياق الضيف باعتباره الوقت الذي تستخدمه سلسلة عمليات وحدة المعالجة المركزية الافتراضية المقابلة. يعرض KVM_RUN عندما يكون هناك حدث يجب معالجته بواسطة VMM، مثل I/O أو نهاية المقاطعة أو إيقاف وحدة المعالجة المركزية الافتراضية. يعالج VMM الحدث ويطلب KVM_RUN مرة أخرى.

خلال فترة KVM_RUN، تظل سلسلة المحادثات استباقية من خلال أداة جدولة المضيف، باستثناء تنفيذ رمز برنامج Hypervisor (مراقب EL2)، وهو إجراء غير استباقي. ولا تمتلك إدارة الأجهزة الافتراضية للضيف نفسها أي آلية للتحكم في هذا السلوك.

بما أنّه تتم جدولة جميع سلاسل وحدة المعالجة المركزية الافتراضية مثل أي مهام أخرى ضمن مساحة المستخدم، فإنها تخضع لجميع آليات جودة الخدمة العادية. على وجه التحديد، يمكن ربط كل سلسلة محادثات وحدة معالجة مركزية افتراضية بوحدات معالجة مركزية (CPU) مادية، ووضعها في وحدات تكلفة قصوى، أو زيادتها أو وضع حدّ لها من خلال تثبيت التطبيقات، وتغيير سياسة الأولوية أو الجدولة وغير ذلك.

الأجهزة الافتراضية

يتوافق crosvm مع عدد من الأجهزة، بما في ذلك ما يلي:

  • virtio-blk لصور الأقراص المركّبة، للقراءة فقط أو القراءة والكتابة
  • vhost-vsock للتواصل مع المضيف
  • virtio-pci كنقل virtio
  • الساعة في الوقت الفعلي pl030 (RTC)
  • 16550a UART للاتصال التسلسلي

البرامج الثابتة لأجهزة pVM

تجدر الإشارة إلى أنّ برامج pvm الثابتة (pvmfw) هي أول رمز يتم تنفيذه بواسطة جهاز افتراضي (pVM)، وهو يشبه ذاكرة التخزين المؤقت للتشغيل على جهاز فعلي. ويتمثّل الهدف الأساسي من pvmfw في بدء التشغيل الآمن واستخلاص السر الفريد للجهاز في الوقت الفعلي (pvmfw).

يتم تخزين البرنامج الثنائي pvmfw في قسم فلاش يحمل الاسم نفسه ويتم تعديله باستخدام عبر الهواء.

تشغيل الجهاز

وتتم إضافة التسلسل التالي من الخطوات إلى إجراء تمهيد (بدء تشغيل الجهاز) الذي يستخدم pKVM:

  1. يحمّل برنامج تحميل Android (ABL) pvmfw من القسم إلى الذاكرة ويتحقق من الصورة.
  2. تحصل ABL على أسرار محرك تكوين معرف الجهاز (DICE) (معرفات الأجهزة المركّبة (CDI) وسلسلة شهادات DICE) من جذر الثقة.
  3. يستمد ABL CDI الضروري لـ pvmfw، ثم يلحقها بالبرنامج الثنائي pvmfw.
  4. تضيف واجهة ABL عقدة تخزين linux,pkvm-guest-firmware-memory محجوزة إلى DT، وتصف موقع وحجم البرنامج الثنائي pvmfw والأسرار التي اشتقاقها في الخطوة السابقة.
  5. تعمل تقنية ABL بين يدي نظام التشغيل Linux ويقوم Linux بتهيئة pKVM.
  6. تزيل pKVM منطقة ذاكرة pvmfw من جداول صفحات المرحلة الثانية للمضيف وتحميها من المضيف (والضيوف) خلال مدة تشغيل الجهاز.

بعد تشغيل الجهاز، يتم تشغيل Microdroid وفقًا للخطوات الواردة في قسم تسلسل التمهيد في مستند Microdroid.

تشغيل جهاز افتراضي (PVM)

عند إنشاء جهاز افتراضي (pVM)، يجب أن ينشئ crosvm (أو VMM آخر) زهرية كبيرة بما يكفي لتعبئتها بصورة pvmfw بواسطة برنامج Hypervisor (مراقب الأجهزة الظاهرية). يتم أيضًا حظر VMM في قائمة السجلات التي يمكن تحديد قيمتها الأولية (x0-x14 لوحدة المعالجة المركزية الافتراضية الأساسية، ولا شيء بالنسبة إلى وحدات المعالجة المركزية الافتراضية الثانوية). يتم حجز السجلات المتبقية وهي جزء من Hypervisor-pvmfw ABI.

عند تشغيل جهاز افتراضي (pVM)، يتحكّم برنامج Hypervisor (مراقب الأجهزة الظاهرية) لأول مرة في وحدة المعالجة المركزية الافتراضية على pvmfw. تتوقع البرامج الثابتة أنّ crosvm قد حمّل نواة موقعة بـ AVB، وقد يكون برنامج إقلاع أو أي صورة أخرى، و FDT غير موقَّع على الذاكرة في أوقات إزاحة معروفة. ويقوم pvmfw بالتحقق من توقيع AVB، وعند نجاحه، ينشئ شجرة جهاز موثوق بها من نقطة FDT المستلمة ويمحو أسراره من فرعه إلى الذاكرة. في حال لم تنجح إحدى خطوات التحقّق، ستصدر البرامج الثابتة طلبًا فائقًا في PSCI SYSTEM_RESET.

بين عمليات التشغيل، يتم تخزين المعلومات حول مثيل pVM في قسم (جهاز virtio-blk) ويتم تشفيرها باستخدام سر pvmfw لضمان إدارة المفتاح السري على المثيل الصحيح بعد إعادة التشغيل.