
Моето текущо разбиране:
1) KVM
KVM (Kernel-based Virtual Machine) – хипервизор (VMM – Virtual Machine Manager), работещ като модул на операционната система Linux. Хипервизорът е необходим, за да стартира софтуер в не съществуваща (виртуална) среда и в същото време да скрие от този софтуер реалното физическо оборудване, на което той работи. Хипервизорът играе ролята на "прокладка" между физическото оборудване (хоста) и виртуалната операционна система (госта).
Тъй като KVM е стандартен модул на ядрото на Linux, той получава от ядрото всички необходими преимущества (работа с памет, планировчик и т.н.). Следователно, в крайна сметка всички тези предимства се отразяват и на гостите (тъй като гостите работят на хипервизор, който работи в/на ядрото на операционната система Linux).
KVM е много бърз, но сам по себе си не е достатъчен за стартиране на виртуална ОС, тъй като за това е необходима емуляция на I/O. За I/O (процесор, дискове, мрежа, видео, PCI, USB, серийни портове и др.) KVM използва QEMU.
2) QEMU
QEMU (Quick Emulator) – емулятор на различни устройства, който позволява стартиране на операционни системи, предназначени за една архитектура, на друга (например, ARM –> x86). Освен процесора, QEMU емулира различни периферни устройства: мрежови карти, HDD, видеокарти, PCI, USB и т.н.
Работи така:
Инструкции/бинарен код (например, ARM) се конвертират в междинен платформонезависим код с помощта на конвертера TCG (Tiny Code Generator) и след това този платформонезависим бинарен код се конвертира в целеви инструкции/код (например, x86).
ARM –> междинен_код –> x86
По същество можете да стартирате виртуални машини на QEMU на всеки хост, дори и със стари модели процесори, които не поддържат Intel VT-x (Intel Virtualization Technology) / AMD SVM (AMD Secure Virtual Machine). Въпреки това, в такъв случай, работата ще бъде доста бавна, поради факта, че изпълняемият бинарен код трябва да се прекомпилира на лето два пъти с помощта на TCG (TCG – това е Just-in-Time компилатор).
Т.е. сам по себе си QEMU е страхотен, но работи много бавно.
3) Protection rings

Бинарният програмен код на процесорите не работи просто така, а се разполага на различни нива (кол rings / Protection rings) с различни нива на достъп до данни, от най-привилегированото (Ring 0) до най-ограниченото, строго регулирано и "с навити гайки" (Ring 3).
Операционната система (ядрото на ОС) работи на Ring 0 (режим на ядрото) и може да прави всичко с данните и устройствата. Потребителските приложения работят на ниво Ring 3 (потребителски режим) и нямат право да правят каквото и да е, вместо това всякога трябва да искат достъп за извършване на определена операция (така потребителските приложения имат достъп само до собствените си данни и не могат да „влизат“ в „чуждата пясъчна кутия“). Ring 1 и 2 са предназначени за използване от драйвери.
До изобретяването на Intel VT-x / AMD SVM, хипервизорите работеха на Ring 0, а гостите работеха на Ring 1. Понеже Ring 1 няма достатъчно права за нормалното функциониране на ОС, при всеки привилегирован повик от гостовата система, хипервизорът трябваше на лето да модифицира това повикване и да го изпълни на Ring 0 (приблизително така, както го прави QEMU). Т.е. гостовият бинарен код НЕ се изпълняваше директно на процесора и всеки път минаваше през няколко междинни модификации на лето.
Разходите бяха значителни и това беше голям проблем, и тогава производителите на процесори, независимо един от друг, пуснаха разширен набор от инструкции (Intel VT-x / AMD SVM), позволяващи изпълнението на код на гостови ОС ДИРЕКТНО на хост процесора (пропускайки всякакви разходни междинни етапи, както беше преди).
С появата на Intel VT-x / AMD SVM, беше създаден специален нов уровень Ring -1 (минус едно). И сега на него работи хипервизорът, а гостите работят на Ring 0 и получават привилегирован достъп до CPU.
Т.е. в крайна сметка:
- хостът работи на Ring 0
- гостите работят на Ring 0
- хипервизорът работи на Ring -1
4) QEMU-KVM
KVM предоставя достъп на гостите до Ring 0 и използва QEMU за еймулиране на I/O (процесор, дискове, мрежа, видео, PCI, USB, сериен порт и т.н., които „виждат“ и с които работят гостите).
От тук QEMU-KVM (или KVM-QEMU) 🙂
КРЕДИТИ
P.S. Текстът на тази статия първоначално беше публикуван в Telegram канала като отговор на въпроса на един от участниците в канала.
Напишете в коментара, къде не разбирам темата или ако има какво да добавя.
Благодаря!
Източник: habr.com
