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