Когда VirtualBox работает на платформе x86 , согласно документации:
Когда включена аппаратная виртуализация (т. Е. VT-x или AMD-V), гипервизор (т. Е. Сам VirtualBox) работает в корневом режиме VMX (он же кольцо -1), а виртуальные машины работают в режиме без полномочий root (он же кольцо 0). , Так работают и другие гипервизоры.
С другой стороны, когда аппаратная виртуализация недоступна, вместо нее используется программная виртуализация и гостевые ядра работают в кольце 1. Из раздела 10.6 ссылки выше:
Код гостевого кольца 3 запускается без изменений, на полной скорости, насколько это возможно ...
Для гостевого кода в кольце 0 Oracle VM VirtualBox использует хитрый трюк. Он на самом деле реконфигурирует гостя так, что его код ring-0 вместо этого запускается в ring 1, который обычно не используется в операционных системах x86). В результате, когда код гостевого кольца 0, фактически выполняющий n звонка 1, такой как драйвер гостевого устройства, пытается записать в регистр ввода-вывода или выполнить привилегированную инструкцию, гипервизор Oracle VM VirtualBox в "реальном" кольце 0 может взять на себя
...
- Запуск кода ring 0 в ring 1 вызывает много дополнительных ошибок команд, так как ring 1 не разрешено выполнять какие-либо привилегированные инструкции, из которых ring-0 гостя содержит много. При каждом из этих сбоев VMM должен вмешиваться и эмулировать код для достижения желаемого поведения. Хотя это работает, эмуляция тысяч таких сбоев обходится очень дорого и сильно снижает производительность виртуализированного гостя.
Это интересно, так как это единственное применение кольца 1, с которым я столкнулся.
Согласно приведенным выше разделам, даже если гостевые ядра работают в кольце 1, когда драйвер гостевого устройства пытается выполнить запись в регистр ввода-вывода или выполнить привилегированную инструкцию, гипервизор VirtualBox (кольцо 0) должен вступить во владение. Таким образом, создается впечатление, что потери производительности, связанные с виртуализацией программного обеспечения, будут одинаковыми, если гостевые ядра работают в кольце 1 против кольца 3.
Я наткнулся на этот пост, который говорит:
Кольца 1 и 2 в некотором смысле "в основном" привилегированы. Они могут получить доступ к страницам супервизора, но если они попытаются использовать привилегированную инструкцию, они по-прежнему будут GPF, как кольцо 3. Так что это не плохое место для водителей, как планировала Intel ...
Вопросы
Как запуск гостевых ядер в кольце 1 вместо кольца 3 повышает производительность.
Каковы последствия безопасности запуска гостевых ядер в кольце 1 (и, следовательно, предоставления гостевым ядрам "доступа к страницам супервизора")?