VirtualizationService

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 แต่ละรายการจะระบุด้วยตัวระบุบริบท (CID) ขนาด 32 บิต ซึ่งคล้ายกับที่อยู่ IP ซึ่ง VirtualizationServiceInternalกำหนดให้กับ VM เมื่อ VirtualizationService สร้าง VM และสามารถเปิดเผยบริการในหมายเลขพอร์ตใดก็ได้ที่ VM เลือก CID จะไม่ซ้ำกันขณะที่ VM ทำงาน แต่สามารถนำค่า CID กลับมาใช้ใหม่ได้ เมื่อ VM สิ้นสุดการทำงานและมีการทิ้งIVirtualMachineแฮนเดิล Binder ทั้งหมดไปยัง VM

อินเทอร์เฟซการแก้ไขข้อบกพร่อง

คำสั่ง vm มีไว้เพื่อการแก้ไขข้อบกพร่อง คำสั่งนี้ช่วยให้นักพัฒนาซอฟต์แวร์ เริ่ม VM จากเชลล์ ดูบันทึก และสิ้นสุด VM ได้ เมื่อใช้คำสั่ง vm หรืออินเทอร์เฟซอื่นๆ ที่ AVF จัดเตรียมไว้ VM จะเริ่มทำงานได้ทั้งในโหมดที่แก้ไขข้อบกพร่องได้ (FULL) หรือโหมดที่แก้ไขข้อบกพร่องไม่ได้ (NONE) VM ที่แก้ไขข้อบกพร่องได้ช่วยให้คุณ ดูบันทึกระดับระบบปฏิบัติการ เข้าถึงเชลล์ ADB และบันทึกการทิ้งข้อมูลเมื่อเกิดข้อขัดข้องหรือเพย์โหลดของแอปได้ ขอแนะนำให้ใช้ VM ที่ดีบักไม่ได้ในเวอร์ชันที่ใช้งานจริง ดูข้อมูลเพิ่มเติมเกี่ยวกับ เครื่องมือบรรทัดคำสั่งและอินเทอร์เฟซการแก้ไขข้อบกพร่องอื่นๆ ที่ AVF มีให้ได้ที่ debug/README.md