1 of 19

ОС. Виртуализация

Лекция 10

2 of 19

Что такое виртуализация?

  • Виртуализация - сокрытие каких-либо ресурсов от пользователя за некоторой абстракцией (т. е. предоставление “виртуальных” ресурсов, вместо реальных)
    • процессы ОС работают с виртуальной памятью
    • JVM предоставляет интерфейс некоторой виртуальной машины, вместо реальных аппаратных ресурсов
    • компилятор, тоже определяет некоторую абстрактную машину, которая исполняет программу на заданном языке
    • нас будет интересовать виртуализация в узком смысле - виртуализация аппаратных ресурсов для ОС

3 of 19

Зачем нужна виртуализация?

  • Изоляция
    • например, мы хотим отделить процессы ОС друг от друга
    • или отделить работающие экземпляры ОС друг от друга
  • Абстракция
    • например, JVM скрывает низкоуровневые детали архитектуры от приложения
    • то же самое применимо и к компиляторам
  • Консолидация
    • например, запустив несколько экземпляров ОС на одной машине, мы можем эффективнее использовать ресурсы (тоже количество клиентов, на меньшем количестве оборудования) - все равно большую часть времени они ждут
  • Отладка
    • отлаживать в виртуальном машине проще чем на реальном железе
    • JVM создавалась как удобный инструмент разработки

4 of 19

Эффективная виртуализация

  • Виртуализация называется эффективной, если “статистически преобладающее подмножество инструкций” исполняются непосредственно на железе
    • т. е. большинство инструкций просто исполняются на процессоре без всяких дополнительных действий со стороны виртуальной машины
    • таким образом QEMU и ему подобные отпадают, когда мы говорим об эффективной виртуализации
    • все “чувствительные” инструкции должны перехватываться (т. е. если кто-то пытается выполнить такую инструкцию генерируется прерывание, которое мы можем обработать)
    • архитектура x86 не поддерживает эффективную виртуализацию (не поддерживала), но всем очень хочется иметь виртуализацию именно для x86
    • оригинальная статья Попека и Годберга свободно доступна, например, по ссылке: http://cs.nyu.edu/courses/fall14/CSCI-GA.3033-010/popek-goldberg.pdf

5 of 19

Подходы к виртуализации

  • Бинарная трансляция
    • используя бинарную трансляцию можно виртуализировать все что угодно (QEMU)
    • возможно, с использованием некоторой аппаратной поддержкой
    • желательно быстрее, чем это делает QEMU, т. е. по возможности выполнять большинство кода без изменений (очевидно, что если мы исполняем x86 код на x86 процессоре, то транслировать все нет необходимости)
  • Паравиртуализация
    • мы разрешаем себе изменять код ОС
    • это одновременно и упрощает и усложняет жизнь: если можно изменить код ОС, то можно добавить в ОС поддержку виртуализации любой сложности, но ценной усложнения поддержки
    • можно использовать аппаратную поддержку, если она доступна

6 of 19

Эффективная бинарная трансляция

  • Проблемы связанные с бинарной трансляцией:
    • как узнать, где находится код?
    • как минимизировать количество транслируемого кода?
  • Эффективная бинарная трансляция
    • код транслируется базовыми блоками (до инструкции перехода), если по какому-то адресу передано управление, то это код и он будет исполняться как минимум до инструкции перехода
    • при трансляции заменяются только “чувствительные” инструкции, остальные остаются без изменений, а “чувствительные” инструкции заменяются на вызов виртуальной машины
    • транслированные блоки сохраняются в кеш, чтобы не производить повторную трансляцию тех же блоков
    • трансляция выполняется только для кода в привелигированном режиме, userspace код исполняется нативно

7 of 19

Пример трансляции базового блока

addl $4, %esp

movl %cr0, %eax

orl $(1 << 31), %eax

addl $4, %esp

movl %cr0, %eax

orl $(1 << 31), %eax

movl %eax, %cr0 // *bad

pushl $enable_64bit_gdt

call videomem_puts // branch

pushl %eax

call trap_set_cr0

pushl $enable_64bit_gdt

pushl $videomem_puts

call trap_call

* not actually, use it just as an example

8 of 19

Бинарная трансляция и привилегии

* мы могли бы использовать Ring1 или Ring2, чтобы обеспечить большую степень изоляции

9 of 19

Аппаратная поддержка виртуализации CPU

  • Аппаратная поддержка
    • в 2006 году стали доступны процессоры с поддержкой Intel-VT и AMD-V
    • обе технологии делают, фундаментально, одно и то же, но отличаются в деталях
    • они позволяют перехватывать чувствительные инструкции тем самым превращая x86 в эффективно виртуализуемую платформу (по Попеку и Голдбергу)
    • первое поколение Intel-VT и AMD-V проигрывало по скорости бинарной трансляции из-за большой стоимости перехода между кодом ОС и кодом гиппервизора (вот она эффективная виртуализация в деле)

10 of 19

Аппаратная поддержка виртуализации CPU

11 of 19

Виртуализация памяти

  • Необходимо разделить всю физическую память между VM так, чтобы они не заметили
    • условно, каждая VM должна иметь N Mb физической памяти начиная с 0
    • этого легко добиться используя paging
    • но все современные ОС используют paging сами, и если мы не хотим ручками транслировать каждое обращение к памяти (как это делает QEMU), то придется что-то придумать
    • мы можем перехватывать операции записи и чтения в cr3 (указатель на корневую таблицу страниц), а значит можем подставлять вместо таблицы страниц ОС свою таблицу страниц (назовем ее таблицей станиц VM)
    • мы так же можем перехватывать изменения в таблице страниц ОС (как?)

12 of 19

Адресные пространства при виртуализации

  • Virtual Address Space (VA) - “виртуальная” память
    • это та виртуальная память, которую настраивает ОС
  • Physical Address Space (PA) - “физическая” память
    • это то что ОС внутри VM считает доступной физической памяти, т. е. это не настоящая физическая память
    • таблица страниц ОС отображает VA на PA
  • Machine Address Space (MA) - настоящая физическая память
    • это настоящая физическая память, которая разделяется между VM
    • гиппервизор должен поддерживать отображение между PA виртуальных машин на MA
    • т. е. у нас есть сразу два отображения, как осуществлять сразу два отображения эффективно без аппаратной поддержки?
    • самая популярная и довольно эффективная техника - shadow tables

13 of 19

Shadow Tables

  • ОС может менять отображение VA на PA двумя способами:
    • ОС может подменять указатель на корневую таблицу страниц (значение регистра cr3)
    • ОС может менять записи в таблицах страниц, не подменяя указатель в cr3
  • Гиппервизор может перехватывать обе операции, но что он должен делать?
    • в первом случае, мы можем создать копию таблицы страниц и зная отображение PA на MA, заменить в копии все PA адреса на MA адреса и записать в cr3 корневой указатель на копию
    • во втором случае, мы можем просто обновить нашу копию
    • таким образом трансляция PA на MA выполняется только при изменениях в отображении VA на PA, а во всех остальных случаях используется прямое отображение VA на MA

14 of 19

Shadow Tables

  • ОС думает, что в cr3 хранится указатель на таблицу страниц ОС, которая задает отображение из VA на PA (OS)
  • На самом деле, в cr3 хранится указатель на Shadow Table, которая задает отображение VA напрямую на MA
  • Таблица страниц VM задает отображение PA на MA (VMM) и используется, чтобы построить Shadow Table, может иметь любой формат - является деталью реализации гиппервизора.

15 of 19

Shadow Tables Updates

  • Мы можем перехватывать запись в таблицу страниц ОС
  • При изменении таблицы страниц ОС мы можем обновить Shadow Table

16 of 19

Аппаратная поддержка виртуализации MMU

  • Intel и AMD добавили в свои процессоры возможности для виртуализации MMU
    • EPT (Extended Page Table) в Intel и RVI (Rapid Vritualization Indexing)
    • как обычно, обе технологии делают то же самое, но отличаются в деталях
    • фактически, они позволяют записать в MMU сразу оба отображения: VA на PA и PA на MA
    • ОС задает отображение VA на PA ничего не зная о втором отображении PA на MA
    • гиппервизор задает отображение PA на MA
    • так как отображение PA на MA меняется очень редко, гиппервизору вообще не нужно вмешиваться, когда ОС работает со своей таблицей страниц
    • в основном это дает серьезный выигрыш в производительности виртуализации, но надо понимать, что цена промаха мимо TLB теперь выше

17 of 19

Виртуализация IO

  • Как предоставлять виртуальной машине доступ к внешним устройствам?
    • дисковые устройства
    • сетевые карты
    • nvdimm?
  • Есть простое и достаточно эффективное решение
    • современные ОС позволяют создавать драйвера
    • создадим драйвер фиктивного устройства, например, сетевой карты, который знает о гиппервизоре и может общаться с ним
    • внутри гиппервизора работает драйвер реального физического устройства (гиппервизор это такая маленькая ОС, в которой тоже могут быть драйвера)
    • это не совсем паравиртуализация, потому что создавать драйвера позволяют все современные популярные ОС, т. е. основной код ОС остается неизменным

18 of 19

Ballon драйвер

  • Подход используемый при виртуализации IO для динамического перераспределения памяти между VM
    • как забрать память у виртуальной машины, если нам недостаточно памяти?
    • просто взять свободные страницы, которые не использует ОС внутри VM?
    • но как определить какие страницы свободные а какие нет?
    • и как удостоверится, что ОС не решит в скором будущем использовать эти страницы, которые мы у нее забрали (и она об этом не знает)?
  • Ballon драйвер
    • знает о гиппервизоре, т. е. может получать запросы от него на “освобождение” какой-то памяти занятой ОС
    • драйвер просит у ОС аллоцировать ему память, ОС больше не может использовать аллоцированные страницы (она думает, что ballon драйвер их использует), а значит эти страницы может использовать гиппервизор

19 of 19

Q&A