VirtualizationService
מנהל את כל ה-VM האורח, מוגן או אחר, הפועל על מערכת אנדרואיד, בעיקר על ידי ניהול מופעים של crosvm. VirtualizationService
חושף ממשק API של AIDL, שבו שירותי מערכת או אפליקציות יכולים להשתמש כדי להפעיל, לנטר ולעצור מכשירי VM.
AIDL API
VirtualizationService
חושף API של AIDL שלקוחות יכולים להשתמש בו כדי לספק תמונות ולהפעיל VM. תיאור זה יכול להיות תצורת VM גולמית עם מתארי קבצים עבור טוען האתחול או הקרנל ותמונות דיסק שונות שייכללו ב-VM, או תצורת Microdroid שבה הלקוח רק מספק את המטען וה-VM מופעל עם ליבת Microdroid ותשתית סטנדרטית. . VirtualizationService
לאחר מכן מחזיר אובייקט IVirtualMachine
Binder המייצג את ה-VM. הלקוח שהפעיל את ה-VM יכול לבחור לשתף את אובייקט Binder עם תהליכים אחרים, תוך שימוש במנגנוני Binder הרגילים.
ל- IVirtualMachine
יש שיטות AIDL כדי לקבל מידע על ה-VM, כמו ה-CID, שניתן להשתמש בו כדי לתקשר איתו דרך vsock, וגם מאפשרת רישום התקשרות חוזרת להיקרא כשה-VM נעצר. במקרה של מכשירי VM IVirtualMachine
ניתן להשתמש באובייקט IVirtualMachine גם כדי להגדיר חיבורי Binder ל-VM.
מחזור חיים של VM
הגישה ל-VM מתבצעת על ידי האובייקט IVirtualMachine
. כל עוד יש התייחסות אחת לפחות לאובייקט IVirtualMachine
אז ה-VM ממשיך לרוץ (אלא אם הוא קורס או נכבה מעצמו). אם כל ההפניות לאובייקט IVirtualMachine
נשמטות לפני שה-VM נכבה, VirtualizationService
מכבה את ה-VM באופן אוטומטי. תהליך זה מרמז שאם הלקוח שהפעיל את ה-VM נסגר על ידי הרוצח עם זיכרון נמוך, אז גם ה-VM נסגר, ובכך מונע דליפות משאבים.
כל VM מנוהל על ידי מופע משלו של crosvm, אשר VirtualizationService
בתורו מנהל בשם הלקוח. VirtualizationService
מתחיל את תהליכי הצאצא ה-crosvm האלה כנדרש, ומעביר להם את מתארי הקבצים עבור התמונות שה-VM צריך. לאחר מכן, VirtualizationService
עוקב אחר תהליך הילד מתי הם מתים, כך שהוא יכול להודיע לכל הלקוחות שנותרו בהתאם.
אריזת VM
crosvm תומך בשתי דרכים שונות לאתחול VM: או ליבה ו-initrd מסופקים או מסופק טוען אתחול. בכל מקרה, ניתן לספק גם מספר שרירותי של תמונות דיסק, שיכולות להיות תמונה גולמית או שילוב של מספר מחיצות. התמונות השונות מסופקות על ידי הלקוח כמתארי קבצים.
VirtualizationService
בונה תמונות דיסק מורכבות לפי דרישה. תהליך זה נחוץ מכיוון שקובץ הדיסק המרוכב מתייחס באופן פנימי לקובצי תמונת המחיצות השונים המרכיבים את הדיסק, אשר מועברים על ידי הלקוח וייתכן שלא יהיו נגישים ישירות על ידי crosvm. כדי לעקוף בעיה זו, VirtualizationService
מבטיח שמספרי מתאר הקבצים שירשו crosvm זהים למספרי מתאר הקבצים שבהם השתמש VirtualizationService ביצירת התמונות המרוכבות. תמונת הדיסק המרוכבת משתמשת בשמות קבצים בצורת /proc/self/fd/N
כדי לייצג כל קובץ מחיצה.
עבור Microdroid pVMs, AVF כולל טוען אתחול, אשר טוען את הליבה ממחיצה של תמונת דיסק מורכבת, בעקבות זרימת האתחול הרגילה של Android Verified.
VM Sockets (vsock)
הממשק העיקרי לתקשורת בין pVMs הוא vsock, ממשק שקע וירטו סטנדרטי. כל VM מזוהה על ידי מזהה הקשר של 32 סיביות (CID), המקביל לכתובת IP, אשר VirtualizationService
מקצה ל-VM כאשר ה-VM נוצר, ויכול לחשוף שירותים בכל מספרי יציאה שה-VM בוחר. ה-CID הוא ייחודי בזמן שה-VM פועל, אך ניתן למחזר את ערך ה-CID כאשר ה-VM מסתיים וכל האחיזה של IVirtualMachine
Binder ל-VM נשמטה.
ממשק ניפוי באגים
הפקודה vm
מסופקת למטרות ניפוי באגים. פקודה זו מאפשרת למפתח להפעיל VM מהמעטפת, להציג את היומנים שלו ולסיים את ה-VM. הפקודה vm
כוללת גם אפשרות לרשום מכשירי VM הפועלים כעת, כולל הסטטוסים והתהליכים המשויכים להם. אפשרות זו מיושמת כשיטה נוספת ב- VirtualizationService
AIDL API אשר, כדי למנוע שימוש לרעה, יכול להיקרא רק על ידי משתמש המעטפת.
AVF כולל גם תמיכה בהעברת חיבור adb
דרך vsock, כדי לספק גישת adb
ל-VMs אורחים. לדוגמה, עבור 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 הפועלים במצב ניפוי באגים.