VirtualizationService
จัดการ Guest VM หลายเครื่อง ได้รับการป้องกันหรือทำงานบนระบบ Android โดยการจัดการอินสแตนซ์ของ crosvm เป็นหลัก VirtualizationService
เปิดเผย AIDL API ซึ่งบริการระบบหรือแอปสามารถใช้เพื่อเริ่ม ตรวจสอบ และหยุด VM หากต้องการใช้ VirtualizationService
ให้ดำเนินการ virtmgr
โดยตรงหรือนำเข้า javalib หรือ rustlib ซึ่งดำเนิน virtmgr
เป็นกระบวนการลูก
วงจรชีวิตของ VM
การเข้าถึง VM ถูกติดตามโดยวัตถุ IVirtualMachine
ตราบใดที่มีการอ้างอิงถึงวัตถุ IVirtualMachine
อย่างน้อยหนึ่งครั้ง VM จะยังคงทำงานต่อไป (เว้นแต่จะขัดข้องหรือปิดตัวลงเอง) หากการอ้างอิงทั้งหมดไปยังวัตถุ IVirtualMachine
หลุดก่อนที่ VM จะปิด VirtualizationService
จะปิด VM โดยอัตโนมัติ กระบวนการนี้บอกเป็นนัยว่าหากไคลเอนต์ที่เริ่ม VM ถูกปิดโดยตัวทำลายหน่วยความจำเหลือน้อย VM ก็จะถูกปิดด้วย ดังนั้นจึงป้องกันการรั่วไหลของทรัพยากร
VM แต่ละตัวได้รับการจัดการโดยอินสแตนซ์ crosvm ของตัวเอง ซึ่ง VirtualizationService
จะจัดการในนามของไคลเอ็นต์ VirtualizationService
ใน virtmgr
เริ่มต้นกระบวนการลูก crosvm เหล่านี้ตามที่จำเป็นสำหรับทรัพยากรส่วนกลางที่จัดสรร รวมถึง CID ที่ได้รับจาก VirtualizationServiceInternal
ใน virtualizationservice
และส่งผ่านตัวอธิบายไฟล์สำหรับอิมเมจที่ VM ต้องการ จากนั้น VirtualizationService
จะตรวจสอบกระบวนการย่อยว่ากระบวนการดังกล่าวเสียชีวิตเมื่อใด เพื่อให้สามารถแจ้งเตือนไคลเอ็นต์ที่เหลือได้ตามนั้น
วีเอ็มบรรจุภัณฑ์
crosvm รองรับสองวิธีที่แตกต่างกันในการบูท VM: มีทั้งเคอร์เนลและ initrd หรือมีให้ bootloader ไม่ว่าในกรณีใด คุณสามารถจัดเตรียมดิสก์อิมเมจตามจำนวนที่ต้องการได้ ซึ่งอาจเป็นอิมเมจดิบหรือหลายพาร์ติชันรวมกันก็ได้ รูปภาพต่างๆ จัดทำโดยไคลเอ็นต์เพื่อใช้เป็นตัวอธิบายไฟล์
VirtualizationService
สร้างอิมเมจดิสก์คอมโพสิตตามความต้องการ กระบวนการนี้จำเป็นเนื่องจากไฟล์คอมโพสิตดิสก์อ้างอิงภายในไปยังไฟล์อิมเมจพาร์ติชันต่างๆ ที่สร้างดิสก์ ซึ่งส่งผ่านโดยไคลเอนต์และอาจไม่สามารถเข้าถึงได้โดยตรงโดย crosvm เพื่อแก้ไขปัญหานี้ VirtualizationService
จะตรวจสอบให้แน่ใจว่าหมายเลขตัวอธิบายไฟล์ที่สืบทอดโดย crosvm เหมือนกับหมายเลขตัวอธิบายไฟล์ที่ VirtualizationService
ใช้ในการสร้างอิมเมจคอมโพสิต อิมเมจดิสก์คอมโพสิตใช้ชื่อไฟล์ในรูปแบบเป็น /proc/self/fd/N
เพื่อแสดงแต่ละไฟล์พาร์ติชัน
สำหรับ Microdroid pVM นั้น AVF จะมีโปรแกรมโหลดบูตซึ่งจะโหลดเคอร์เนลจากพาร์ติชันของอิมเมจดิสก์คอมโพสิต ตามโฟลว์การบูตที่ยืนยันโดย Android มาตรฐาน
ซ็อกเก็ต VM (vsock)
อินเทอร์เฟซหลักสำหรับการสื่อสารระหว่าง pVM คือ vsock ซึ่งเป็นอินเทอร์เฟซซ็อกเก็ต virtio มาตรฐาน VM แต่ละตัวจะถูกระบุโดยตัวระบุบริบท (CID) 32 บิต ซึ่งคล้ายคลึงกับที่อยู่ IP ซึ่ง VirtualizationServiceInternal
กำหนดให้กับ VM เมื่อ VirtualizationService
สร้าง VM และสามารถเปิดเผยบริการบนหมายเลขพอร์ตใดก็ตามที่ VM เลือก CID จะไม่ซ้ำกันในขณะที่ VM กำลังทำงาน แต่ค่า CID สามารถรีไซเคิลได้เมื่อ VM ถูกยกเลิก และตัวประสาน IVirtualMachine
ทั้งหมดไปยัง VM ได้ถูกละทิ้ง
อินเตอร์เฟซการแก้ปัญหา
คำสั่ง vm
มีไว้เพื่อวัตถุประสงค์ในการดีบัก คำสั่งนี้ช่วยให้นักพัฒนาเริ่มต้น VM จากเชลล์ ดูบันทึก และยุติ VM ด้วยคำสั่ง vm
หรืออินเทอร์เฟซอื่นๆ ที่ AVF จัดเตรียมไว้ให้ VM สามารถเริ่มทำงานในโหมด debuggable (FULL) หรือ non-debuggable (NONE) ด้วย VM ที่แก้ไขข้อบกพร่องได้ คุณสามารถดูบันทึกระดับ OS เข้าถึงเชลล์ ADB และบันทึกข้อมูลความผิดพลาดหรือเพย์โหลดของแอปได้ ขอแนะนำให้ใช้ VM ที่ไม่สามารถแก้ไขข้อบกพร่องได้ในการใช้งานจริง หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับเครื่องมือบรรทัดคำสั่งและอินเทอร์เฟซการดีบักอื่นๆ ที่ AVF จัดเตรียมไว้ให้ โปรดดูที่ debug/README.md