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