الخدمة الافتراضية

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

تدير VirtualizationService جميع أجهزة VM الخاصة بالضيف ، سواء كانت محمية أو غير ذلك ، تعمل على نظام Android ، وذلك بشكل أساسي من خلال إدارة مثيلات crosvm. تعرض VirtualizationService واجهة AIDL API ، والتي يمكن لخدمات أو تطبيقات النظام استخدامها لبدء تشغيل الأجهزة الافتراضية ومراقبتها وإيقافها.

AIDL API

تعرض VirtualizationService واجهة AIDL API التي يمكن للعملاء استخدامها لتوفير الصور وبدء تشغيل VM. يمكن أن يكون هذا الوصف إما تكوين VM أوليًا مع واصفات ملفات لبرنامج bootloader أو kernel وصور قرص متنوعة لتضمينها في VM ، أو تكوين Microdroid حيث يوفر العميل فقط الحمولة ويبدأ الجهاز الظاهري بنواة Microdroid القياسية والبنية التحتية . ثم تقوم VirtualizationService بإرجاع كائن IVirtualMachine Binder الذي يمثل الجهاز الظاهري. يمكن للعميل الذي بدأ تشغيل الجهاز الظاهري اختيار مشاركة كائن Binder مع عمليات أخرى ، باستخدام آليات Binder المعتادة.

يحتوي IVirtualMachine على طرق AIDL للحصول على معلومات حول الجهاز الظاهري ، مثل CID ، والذي يمكن استخدامه للتواصل معه عبر vsock ، ويسمح أيضًا بتسجيل رد الاتصال ليتم استدعاؤه عند توقف الجهاز الظاهري. في حالة Microdroid VMs ، يمكن أيضًا استخدام كائن IVirtualMachine لإعداد اتصالات Binder بجهاز VM.

دورة حياة الجهاز الافتراضي

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

تتم إدارة كل جهاز افتراضي من خلال مثيله الخاص من crosvm ، والذي تديره VirtualizationService بدورها نيابة عن العميل. تبدأ VirtualizationService هذه العمليات التابعة لـ crosvm كما هو مطلوب ، وتمرر لهم واصفات الملفات للصور التي يحتاجها VM. ثم تقوم VirtualizationService بمراقبة عملية الطفل عند وفاته ، لذلك يمكنها إخطار أي عملاء متبقين وفقًا لذلك.

تغليف VM

يدعم crosvm طريقتين مختلفتين لتمهيد الجهاز الظاهري: إما أن يتم توفير النواة و initrd أو يتم توفير أداة تحميل التشغيل. في كلتا الحالتين ، يمكن أيضًا توفير عدد عشوائي من صور القرص ، والتي قد تكون إما صورة خام أو مركبًا من عدة أقسام. يتم توفير الصور المختلفة من قبل العميل كأوصاف ملفات.

تقوم VirtualizationService ببناء صور قرص مركب عند الطلب. هذه العملية ضرورية لأن ملف القرص المركب يشير داخليًا إلى ملفات صورة القسم المختلفة التي يتكون منها القرص ، والتي يتم تمريرها بواسطة العميل وقد لا يمكن الوصول إليها مباشرة بواسطة crosvm. للتغلب على هذه المشكلة ، تضمن VirtualizationService أن أرقام واصف الملف الموروثة بواسطة crosvm هي نفس أرقام واصف الملف التي استخدمتها VirtualizationService في إنشاء الصور المركبة. تستخدم صورة القرص المركب أسماء الملفات في النموذج /proc/self/fd/N لتمثيل كل ملف قسم.

بالنسبة إلى Microdroid pVMs ، يشتمل AVF على أداة تحميل التمهيد ، والتي تقوم بتحميل النواة من قسم من صورة قرص مركب ، باتباع تدفق التشغيل القياسي الذي تم التحقق منه من Android.

مآخذ VM (vsock)

الواجهة الأساسية للاتصال بين pVMs هي vsock ، وهي واجهة مأخذ توصيل Virtio قياسية. يتم تحديد كل جهاز افتراضي بواسطة معرف سياق 32 بت (CID) ، وهو مشابه لعنوان IP ، الذي تقوم VirtualizationService بتعيينه إلى الجهاز الظاهري عند إنشاء الجهاز الظاهري ، ويمكنه عرض الخدمات على أي أرقام منافذ يختارها الجهاز الظاهري. يعتبر CID فريدًا أثناء تشغيل الجهاز الظاهري ، ولكن يمكن إعادة تدوير قيمة CID عند إنهاء الجهاز الظاهري وإسقاط جميع مقابض IVirtualMachine Binder إلى الجهاز الظاهري.

واجهة التصحيح

يتم توفير الأمر vm لأغراض التصحيح. يتيح هذا الأمر للمطور بدء تشغيل جهاز افتراضي من shell ، وعرض سجلاته ، وإنهاء الجهاز الظاهري. يتضمن الأمر vm أيضًا خيارًا لسرد أجهزة VM قيد التشغيل حاليًا ، بما في ذلك حالاتها والعمليات المرتبطة بها. يتم تنفيذ هذا الخيار كطريقة إضافية على VirtualizationService AIDL API والتي ، لتجنب إساءة الاستخدام ، لا يمكن استدعاءها إلا بواسطة مستخدم shell.

يتضمن AVF أيضًا دعمًا لإعادة توجيه اتصال adb عبر vsock ، لتوفير وصول adb إلى أجهزة VM الضيف. على سبيل المثال ، بالنسبة إلى Microdroid VM مع CID 10 يعمل adbd على المنفذ 5555 ، يمكن للمطور الحصول على غلاف في Microdroid VM من محطة العمل الخاصة به باستخدام الأوامر التالية:

    $ adb forward tcp:8000 vsock:10:5555
    $ adb connect localhost:8000
    $ adb -s localhost:8000 shell

إعادة توجيه اتصال adb عبر vsock متاح فقط لأجهزة VM التي تعمل في وضع التصحيح.