Qemu :
QEmu เป็นซอฟต์แวร์ที่สมบูรณ์และเป็นแบบสแตนด์อโลนของตัวเอง คุณใช้มันเพื่อเลียนแบบเครื่องจักรมันมีความยืดหยุ่นและพกพาได้มาก ส่วนใหญ่จะทำงานโดย 'recompiler' พิเศษที่แปลงรหัสไบนารี่ที่เขียนขึ้นสำหรับหน่วยประมวลผลที่กำหนดให้เป็นอีกอันหนึ่ง (เช่นเพื่อรันโค้ด MIPS บน PPC mac หรือ ARM ใน x86 PC)
เพื่อเลียนแบบมากกว่าตัวประมวลผล Qemu มีรายการตัวเลียนแบบอุปกรณ์ต่อพ่วงมากมาย: ดิสก์เครือข่าย VGA, PCI, USB, พอร์ตอนุกรม / พอร์ตขนาน ฯลฯ
KQemu :
ในกรณีเฉพาะที่ทั้งต้นทางและปลายทางเป็นสถาปัตยกรรมเดียวกัน (เช่นกรณีทั่วไปของ x86 บน x86) มันยังคงต้องแยกวิเคราะห์รหัสเพื่อลบ 'คำแนะนำพิเศษ' และแทนที่ด้วยบริบทสวิตช์ เพื่อให้มีประสิทธิภาพมากที่สุดใน x86 Linux มีโมดูลเคอร์เนลชื่อ KQemu ที่จัดการสิ่งนี้
ในฐานะที่เป็นโมดูลเคอร์เนล KQemu สามารถเรียกใช้งานโค้ดส่วนใหญ่ไม่เปลี่ยนแปลงโดยแทนที่เฉพาะคำแนะนำในระดับต่ำสุดเท่านั้น ในกรณีนั้น userspace Qemu ยังคงจัดสรร RAM ทั้งหมดสำหรับเครื่องที่จำลองและโหลดรหัส ข้อแตกต่างคือแทนที่จะทำการคอมไพล์โค้ดใหม่ซึ่งจะเรียก KQemu เพื่อสแกน / แก้ไข / เรียกใช้งาน การจำลองฮาร์ดแวร์ต่อพ่วงทั้งหมดทำใน Qemu
นี่เร็วกว่า Qemu ธรรมดามากเพราะรหัสส่วนใหญ่ไม่เปลี่ยนแปลง แต่ยังต้องเปลี่ยนรหัส ring0 (รหัสส่วนใหญ่ในเคอร์เนลของ VM) ดังนั้นประสิทธิภาพจึงยังคงลดลง
KVM :
KVM เป็นสองสิ่ง: อันดับแรกคือโมดูลเคอร์เนล Linux ซึ่งตอนนี้รวมอยู่ในการฉีดซึ่งจะเปลี่ยนโปรเซสเซอร์ให้อยู่ในสถานะ 'แขก' ใหม่ สถานะแขกมีชุดสถานะแหวนของตนเอง แต่คำแนะนำริง 0 ที่มีสิทธิใช้งานจะกลับไปที่รหัสไฮเปอร์ไวเซอร์ เนื่องจากเป็นโหมดตัวประมวลผลใหม่ของการประมวลผลจึงไม่จำเป็นต้องแก้ไขรหัสใด ๆ
นอกเหนือจากการเปลี่ยนสถานะของตัวประมวลผลแล้วเคอร์เนลโมดูลยังจัดการส่วนจำลองระดับต่ำบางส่วนเช่นการลงทะเบียน MMU (ใช้เพื่อจัดการ VM) และบางส่วนของฮาร์ดแวร์ที่จำลอง PCI
ประการที่สอง KVM เป็นทางแยกของ Qemu ที่ปฏิบัติการได้ ทั้งสองทีมทำงานอย่างแข็งขันเพื่อรักษาความแตกต่างอย่างน้อยและมีความก้าวหน้าในการลด ในที่สุดเป้าหมายคือ Qemu ควรทำงานได้ทุกที่และหากโมดูลเคอร์เนล KVM พร้อมใช้งานก็สามารถใช้งานได้โดยอัตโนมัติ แต่สำหรับอนาคตอันใกล้นี้ทีม Qemu มุ่งเน้นไปที่การจำลองฮาร์ดแวร์และการพกพาในขณะที่ KVM folks มุ่งเน้นไปที่โมดูลเคอร์เนล (บางครั้งย้ายส่วนเล็ก ๆ ของการจำลองที่นั่นถ้ามันปรับปรุงประสิทธิภาพ) และเชื่อมต่อกับส่วนที่เหลือของรหัสผู้ใช้
ไฟล์สั่งการ kvm-qemu ทำงานได้เหมือนปกติ Qemu: จัดสรรแรมโหลดรหัสและแทนที่จะคอมไพล์ใหม่หรือเรียก KQemu มันวางไข่เธรด (นี่เป็นสิ่งสำคัญ) เธรดเรียกใช้โมดูลเคอร์เนล KVM เพื่อสลับไปยังโหมดผู้เยี่ยมชมและดำเนินการเพื่อเรียกใช้โค้ด VM ในคำสั่งที่มีสิทธิพิเศษมันจะสลับกลับไปเป็นโมดูลเคอร์เนล KVM ซึ่งหากจำเป็นให้ส่งสัญญาณเธรด Qemu เพื่อจัดการกับการจำลองฮาร์ดแวร์ส่วนใหญ่
หนึ่งในสิ่งที่ดีของสถาปัตยกรรมนี้คือรหัสแขกถูกจำลองในเธรด posix ซึ่งคุณสามารถจัดการได้ด้วยเครื่องมือ Linux ปกติ หากคุณต้องการ VM ที่มี 2 หรือ 4 คอร์ kvm-qemu สร้างเธรด 2 หรือ 4 เธรดแต่ละตัวจะเรียกใช้โมดูลเคอร์เนล KVM เพื่อเริ่มการทำงาน การทำงานพร้อมกัน - ถ้าคุณมีแกนจริงเพียงพอหรือไม่ - หากไม่มี - จะถูกจัดการโดยตัวกำหนดตารางเวลาปกติของ Linux ทำให้รหัสมีขนาดเล็กและเซอร์ไพรซ์ จำกัด