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

Бинарният софтуерен код на процесорите не работи просто така, а е разположен на различни нива (пръстени / Защитни пръстени) с различни нива на достъп до данните, от най-привилегирования (Ring 0) до най-ограничения, регулиран и „завинтен“ (Ring 3).
Операционната система (ядрото на ОС) работи на Ring 0 (режим на ядрото) и може да прави с всякакви данни и устройства каквото си иска. Потребителските приложения работят на ниво Ring 3 (потребителски режим) и нямат право да правят всичко, което искат, а вместо това всеки път трябва да искат достъп за извършване на дадена операция (по този начин, потребителските приложения имат достъп само до собствените си данни и не могат да "засегнат" "чуждата пясъчница"). Ring 1 и 2 са предназначени за използване от драйвери.
Пред invention 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
