VirtualizationService
چندین VM مهمان را مدیریت می کند، محافظت شده یا غیره، که در سیستم Android اجرا می شوند، عمدتاً با مدیریت نمونه های crosvm. VirtualizationService
یک API AIDL را نشان می دهد که سرویس ها یا برنامه های سیستم می توانند از آن برای راه اندازی، نظارت و توقف VM ها استفاده کنند. برای استفاده از VirtualizationService
، virtmgr
مستقیماً اجرا کنید یا javalib یا rustlib را وارد کنید که virtmgr
به عنوان یک فرآیند فرزند اجرا می کند.
چرخه حیات VM
دسترسی به VM توسط شی IVirtualMachine
ردیابی می شود. تا زمانی که حداقل یک مرجع به شی IVirtualMachine
وجود داشته باشد، ماشین مجازی به کار خود ادامه می دهد (مگر اینکه به خودی خود خراب یا خاموش شود). اگر تمام ارجاعات به شی IVirtualMachine
قبل از خاموش شدن VM حذف شوند، VirtualizationService
به طور خودکار VM را خاموش می کند. این فرآیند به این معنی است که اگر کلاینتی که VM را راه اندازی کرده است توسط کشنده حافظه کم خاموش شود، VM نیز خاموش می شود، بنابراین از نشت منابع جلوگیری می شود.
هر VM توسط نمونه خود از crosvm مدیریت می شود که VirtualizationService
به نوبه خود از طرف مشتری آن را مدیریت می کند. VirtualizationService
در virtmgr
این پردازشهای فرزند crosvm را همانطور که لازم است با منابع اختصاصی جهانی از جمله CID اعطا شده توسط VirtualizationServiceInternal
در virtualizationservice
شروع می کند و توصیفگرهای فایل را برای تصاویر مورد نیاز VM به آنها ارسال می کند. VirtualizationService
سپس فرآیند فرزند را برای زمان مرگ آنها نظارت می کند، بنابراین می تواند مشتریان باقی مانده را بر این اساس مطلع کند.
بسته بندی VM
crosvm از دو روش مختلف برای بوت کردن یک VM پشتیبانی می کند: یا یک هسته و initrd ارائه می شود یا یک بوت لودر ارائه می شود. در هر صورت، تعداد دلخواه از تصاویر دیسک نیز می تواند ارائه شود، که ممکن است یک تصویر خام یا ترکیبی از چندین پارتیشن باشد. تصاویر مختلف توسط مشتری به عنوان توصیف کننده فایل ارائه می شود.
VirtualizationService
تصاویر دیسک کامپوزیت را در صورت تقاضا می سازد. این فرآیند ضروری است زیرا فایل دیسک کامپوزیت به طور داخلی به فایلهای تصویری پارتیشن مختلف تشکیلدهنده دیسک اشاره دارد که توسط مشتری ارسال میشوند و ممکن است مستقیماً توسط crosvm قابل دسترسی نباشند. برای حل این مشکل، VirtualizationService
تضمین می کند که اعداد توصیفگر فایل به ارث برده شده توسط crosvm با شماره های توصیفگر فایل که VirtualizationService
در ایجاد تصاویر ترکیبی استفاده می کند، یکسان است. تصویر دیسک ترکیبی از نام فایل ها به شکل /proc/self/fd/N
برای نمایش هر فایل پارتیشن استفاده می کند.
برای pVM های Microdroid، AVF شامل یک بوت لودر است که هسته را از پارتیشنی از یک تصویر دیسک کامپوزیت بارگیری می کند، طبق جریان استاندارد Android Verified Boot.
سوکت های VM (vsock)
رابط اصلی برای ارتباط بین pVM ها vsock است، یک رابط استاندارد virtio socket. هر ماشین مجازی توسط یک شناسه زمینه 32 بیتی (CID) شناسایی میشود که مشابه یک آدرس IP است که VirtualizationServiceInternal
هنگام ایجاد VM به ماشین VirtualizationService
اختصاص میدهد و میتواند سرویسها را در هر شماره پورتی که VM انتخاب میکند، نمایش دهد. هنگامی که ماشین مجازی در حال اجرا است، CID منحصربهفرد است، اما زمانی که ماشین مجازی پایان مییابد و تمام دستههای بایندر IVirtualMachine
به ماشین مجازی حذف میشوند، میتوان مقدار CID را بازیافت کرد.
رابط اشکال زدایی
دستور vm
برای اهداف دیباگ ارائه شده است. این دستور به توسعهدهنده اجازه میدهد یک VM را از پوسته شروع کند، گزارشهای آن را مشاهده کند و VM را خاتمه دهد. با دستور vm
یا سایر رابط های ارائه شده توسط AVF، یک VM می تواند در حالت اشکال زدایی (FULL) یا غیراشکال زدایی (NONE) راه اندازی شود. با یک VM قابل اشکالزدایی، میتوانید گزارشهای سطح سیستمعامل را ببینید، به پوسته ADB دسترسی داشته باشید، و بارگذاری خرابی یا برنامه را ضبط کنید. توصیه می شود از یک VM غیر قابل اشکال زدایی در تولید استفاده کنید. برای اطلاعات بیشتر در مورد ابزار خط فرمان و سایر رابط های اشکال زدایی که AVF ارائه می دهد، به debug/README.md مراجعه کنید.