Qemu :
QEmu là một phần mềm hoàn chỉnh và độc lập của riêng mình. Bạn sử dụng nó để mô phỏng máy móc, nó rất linh hoạt và di động. Chủ yếu nó hoạt động bởi một 'trình biên dịch lại' đặc biệt để chuyển đổi mã nhị phân được viết cho một bộ xử lý nhất định thành một bộ xử lý khác (giả sử, để chạy mã MIPS trên máy Mac PPC hoặc ARM trong PC x86).
Để mô phỏng không chỉ bộ xử lý, Qemu bao gồm một danh sách dài các trình giả lập ngoại vi: đĩa, mạng, VGA, PCI, USB, cổng nối tiếp / song song, v.v.
KQemu :
Trong trường hợp cụ thể trong đó cả nguồn và đích là cùng một kiến trúc (như trường hợp chung của x86 trên x86), nó vẫn phải phân tích mã để loại bỏ bất kỳ 'hướng dẫn đặc quyền' nào và thay thế chúng bằng các chuyển đổi ngữ cảnh. Để làm cho nó hiệu quả nhất có thể trên x86 Linux, có một mô-đun hạt nhân gọi là KQemu xử lý việc này.
Là một mô-đun hạt nhân, KQemu có thể thực thi hầu hết các mã không thay đổi, chỉ thay thế các hướng dẫn chỉ ring0 ở mức thấp nhất. Trong trường hợp đó, không gian người dùng Qemu vẫn phân bổ tất cả RAM cho máy được mô phỏng và tải mã. Sự khác biệt là thay vì biên dịch lại mã, nó gọi KQemu để quét / vá / thực thi nó. Tất cả các mô phỏng phần cứng ngoại vi được thực hiện trong Qemu.
Tốc độ này nhanh hơn nhiều so với Qemu đơn giản vì hầu hết mã không thay đổi, nhưng vẫn phải chuyển đổi mã ring0 (hầu hết mã trong kernel của VM), do đó hiệu năng vẫn bị ảnh hưởng.
KVM :
KVM là một vài điều: đầu tiên, đó là mô-đun hạt nhân Linux, giờ đây được bao gồm trong dòng máy chính, bộ chuyển đổi bộ xử lý sang trạng thái 'khách' mới. Trạng thái khách có tập hợp các trạng thái vòng riêng, nhưng các lệnh ring0 đặc quyền lại rơi vào mã hypanneror. Vì nó là chế độ thực thi bộ xử lý mới, nên mã không phải sửa đổi theo bất kỳ cách nào.
Ngoài việc chuyển đổi trạng thái bộ xử lý, mô-đun hạt nhân cũng xử lý một số phần mô phỏng cấp thấp như các thanh ghi MMU (được sử dụng để xử lý VM) và một số phần của phần cứng giả lập PCI.
Thứ hai, KVM là một nhánh của thực thi Qemu. Cả hai đội làm việc tích cực để giữ sự khác biệt ở mức tối thiểu, và có những tiến bộ trong việc giảm bớt nó. Cuối cùng, mục tiêu là Qemu sẽ hoạt động ở bất cứ đâu và nếu có sẵn mô-đun hạt nhân KVM, nó có thể được sử dụng tự động. Nhưng trong tương lai gần, nhóm Qemu tập trung vào mô phỏng phần cứng và tính di động, trong khi người dùng KVM tập trung vào mô-đun hạt nhân (đôi khi di chuyển các phần nhỏ của mô phỏng ở đó, nếu nó cải thiện hiệu suất) và giao tiếp với phần còn lại của mã không gian người dùng.
Bộ thực thi kvm-qemu hoạt động như Qemu bình thường: phân bổ RAM, tải mã và thay vì biên dịch lại hoặc gọi KQemu, nó sinh ra một luồng (điều này rất quan trọng). Chuỗi này gọi mô-đun hạt nhân KVM để chuyển sang chế độ khách và tiến hành thực thi mã VM. Theo một hướng dẫn đặc quyền, nó chuyển trở lại mô-đun hạt nhân KVM, nếu cần, sẽ báo hiệu cho luồng Qemu để xử lý hầu hết các mô phỏng phần cứng.
Một trong những điều hay của kiến trúc này là mã khách được mô phỏng theo một chuỗi posix mà bạn có thể quản lý bằng các công cụ Linux thông thường. Nếu bạn muốn một VM có 2 hoặc 4 lõi, kvm-qemu tạo 2 hoặc 4 luồng, mỗi luồng gọi mô-đun hạt nhân KVM để bắt đầu thực thi. Bộ xử lý đồng thời nếu bạn có đủ số lõi thực sự hoặc lập lịch cho bộ phận nếu không có bộ xử lý Linux thông thường, giữ cho mã nhỏ và các bất ngờ bị hạn chế.