VirtualizationService

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