VirtualizationService

VirtualizationService จัดการ VM ของผู้เยี่ยมชมทั้งหมด ทั้งที่ได้รับการป้องกันหรืออย่างอื่น ที่ทำงานบนระบบ Android โดยหลักโดยการจัดการอินสแตนซ์ของ crosvm VirtualizationService เปิดเผย AIDL API ซึ่งบริการหรือแอปของระบบสามารถใช้เพื่อเริ่ม ตรวจสอบ และหยุด VM

AIDL API

VirtualizationService เปิดเผย AIDL API ที่ไคลเอ็นต์สามารถใช้เพื่อจัดเตรียมรูปภาพและเริ่มต้น VM คำอธิบายนี้สามารถเป็นได้ทั้งการกำหนดค่า VM แบบดิบพร้อมตัวอธิบายไฟล์สำหรับ bootloader หรือเคอร์เนล และดิสก์อิมเมจต่างๆ ที่จะรวมไว้ใน VM หรือการกำหนดค่า Microdroid ที่ไคลเอนต์เพียงแค่จัดเตรียมเพย์โหลด และ VM เริ่มต้นด้วยเคอร์เนลและโครงสร้างพื้นฐาน Microdroid มาตรฐาน . VirtualizationService ส่งคืนวัตถุ IVirtualMachine Binder ที่แสดงถึง VM ไคลเอนต์ที่เริ่มต้น VM สามารถเลือกที่จะแบ่งปันวัตถุ Binder กับกระบวนการอื่น ๆ โดยใช้กลไก Binder ปกติ

IVirtualMachine มีเมธอด AIDL เพื่อรับข้อมูลเกี่ยวกับ VM เช่น CID ซึ่งสามารถใช้เพื่อสื่อสารกับมันผ่าน vsock และยังอนุญาตให้ลงทะเบียนการโทรกลับเมื่อ VM หยุดทำงาน ในกรณีของ Microdroid VM สามารถใช้วัตถุ IVirtualMachine เพื่อตั้งค่าการเชื่อมต่อ Binder กับ VM ได้

VM lifecycle

การเข้าถึง VM ถูกติดตามโดยวัตถุ IVirtualMachine ตราบใดที่มีการอ้างอิงอย่างน้อยหนึ่งรายการไปยังวัตถุ IVirtualMachine VM จะยังคงทำงานต่อไป (เว้นแต่จะขัดข้องหรือปิดตัวลงเอง) หากการอ้างอิงทั้งหมดไปยังวัตถุ IVirtualMachine ถูกยกเลิกก่อนที่ VM จะปิดลง VirtualizationService จะปิด VM โดยอัตโนมัติ กระบวนการนี้บอกเป็นนัยว่าหากไคลเอนต์ที่เริ่มต้น VM ถูกปิดโดยนักฆ่าหน่วยความจำเหลือน้อย VM จะปิดตัวลงด้วย ดังนั้นจึงป้องกันการรั่วไหลของทรัพยากร

VM แต่ละรายการได้รับการจัดการโดยอินสแตนซ์ของตัวเองของ crosvm ซึ่ง VirtualizationService จะจัดการในนามของไคลเอ็นต์ VirtualizationService เริ่มกระบวนการย่อย crosvm เหล่านี้ตามต้องการ และส่งตัวอธิบายไฟล์สำหรับอิมเมจที่ VM ต้องการ VirtualizationService จะตรวจสอบกระบวนการย่อยเมื่อพวกเขาตาย เพื่อให้สามารถแจ้งลูกค้าที่เหลือตามนั้นได้

บรรจุภัณฑ์ VM

crosvm รองรับการบูท VM สองวิธีที่แตกต่างกัน: มีเคอร์เนลและ initrd ให้หรือมีให้ bootloader ในทั้งสองกรณี สามารถระบุจำนวนอิมเมจดิสก์ได้ตามต้องการ ซึ่งอาจเป็นอิมเมจดิบหรือหลายพาร์ติชั่น ลูกค้าจัดเตรียมรูปภาพต่างๆ ไว้เป็นไฟล์อธิบาย

VirtualizationService สร้างภาพดิสก์คอมโพสิตตามความต้องการ กระบวนการนี้จำเป็นเนื่องจากไฟล์คอมโพสิตดิสก์อ้างอิงภายในไปยังไฟล์อิมเมจพาร์ติชั่นต่างๆ ที่เขียนดิสก์ ซึ่งส่งผ่านโดยไคลเอนต์และอาจไม่สามารถเข้าถึงได้โดยตรงโดย crosvm เพื่อแก้ไขปัญหานี้ VirtualizationService ตรวจสอบให้แน่ใจว่าหมายเลขตัวอธิบายไฟล์ที่ crosvm สืบทอดมาจะเหมือนกับหมายเลขตัวอธิบายไฟล์ที่ VirtualizationService ใช้ในการสร้างอิมเมจคอมโพสิต อิมเมจดิสก์คอมโพสิตใช้ชื่อไฟล์ในรูปแบบ /proc/self/fd/N เพื่อแสดงไฟล์พาร์ติชั่นแต่ละไฟล์

สำหรับ Microdroid pVMs AVF จะรวม bootloader ซึ่งโหลดเคอร์เนลจากพาร์ติชันของอิมเมจดิสก์คอมโพสิต ตามโฟลว์การบูตมาตรฐานของ Android Verified

ซ็อกเก็ต VM (vsock)

อินเทอร์เฟซหลักสำหรับการสื่อสารระหว่าง pVM คือ vsock ซึ่งเป็นอินเทอร์เฟซซ็อกเก็ต virtio มาตรฐาน VM แต่ละรายการจะถูกระบุโดยตัวระบุบริบทแบบ 32 บิต (CID) ซึ่งคล้ายกับที่อยู่ IP ซึ่ง VirtualizationService กำหนดให้กับ VM เมื่อสร้าง VM และสามารถแสดงบริการบนหมายเลขพอร์ตใดก็ตามที่ VM เลือก CID นั้นไม่ซ้ำกันในขณะที่ VM กำลังทำงานอยู่ แต่ค่า CID สามารถนำกลับมาใช้ใหม่ได้เมื่อ VM ถูกยกเลิกและ IVirtualMachine Binder ทั้งหมดจัดการกับ VM ถูกละทิ้ง

ดีบักอินเทอร์เฟซ

คำสั่ง vm มีไว้เพื่อจุดประสงค์ในการดีบัก คำสั่งนี้ช่วยให้นักพัฒนาสามารถเริ่มต้น VM จากเชลล์ ดูบันทึก และยุติ VM คำสั่ง vm ยังมีตัวเลือกในการแสดงรายการ VM ที่รันอยู่ในปัจจุบัน รวมถึงสถานะและกระบวนการที่เกี่ยวข้อง ตัวเลือกนี้ถูกนำไปใช้เป็นวิธีการพิเศษบน VirtualizationService AIDL API ซึ่งผู้ใช้เชลล์สามารถเรียกได้เฉพาะเพื่อหลีกเลี่ยงการละเมิด

AVF ยังรองรับการส่งต่อการเชื่อมต่อ adb ผ่าน vsock เพื่อให้เข้าถึง adb กับ guest VM ตัวอย่างเช่น สำหรับ Microdroid VM ที่มี CID 10 ที่รัน adbd บนพอร์ต 5555 นักพัฒนาสามารถรับเชลล์ใน Microdroid VM จากเวิร์กสเตชันโดยใช้คำสั่งต่อไปนี้:

    $ adb forward tcp:8000 vsock:10:5555
    $ adb connect localhost:8000
    $ adb -s localhost:8000 shell

การส่งต่อการเชื่อมต่อ adb ผ่าน vsock ใช้ได้เฉพาะกับ VM ที่ทำงานในโหมดดีบักเท่านั้น