Виртуализация x86 — это использование возможностей аппаратной виртуализации на процессоре x86/x86-64.
В конце 1990-х годов виртуализация x86 была достигнута с помощью сложных программных методов, необходимых для компенсации отсутствия у процессора возможностей аппаратной виртуализации при достижении приемлемой производительности. В 2005 и 2006 годах и Intel (VT-x), и AMD (AMD-V) представили ограниченную поддержку аппаратной виртуализации, которая позволила упростить программное обеспечение для виртуализации, но давала очень мало преимуществ в скорости. [1] В более поздних моделях процессоров появилась более широкая аппаратная поддержка, которая позволила существенно повысить скорость.
Следующее обсуждение посвящено только виртуализации защищенного режима архитектуры x86 .
В защищенном режиме ядро операционной системы работает с более высокими привилегиями , например, кольцо 0, а приложения — с более низкими привилегиями, например, кольцо 3. При программной виртуализации хостовая ОС имеет прямой доступ к оборудованию, в то время как гостевые ОС имеют ограниченный доступ к оборудованию, как и любое другое приложение хостовой ОС. Один из подходов, используемый в программной виртуализации x86 для преодоления этого ограничения, называется лишением привилегий кольца , который предполагает запуск гостевой ОС на кольце выше (менее привилегированном), чем 0. [2]
Три метода сделали возможной виртуализацию защищенного режима:
Эти методы приводят к некоторым издержкам производительности из-за отсутствия поддержки виртуализации MMU по сравнению с виртуальной машиной, работающей на изначально виртуализуемой архитектуре, такой как IBM System/370 . [4] : 10 [9] : 17 и 21
На традиционных мэйнфреймах классический гипервизор типа 1 был автономным и не зависел от какой-либо операционной системы и сам не запускал какие-либо пользовательские приложения. Напротив, первые продукты виртуализации x86 были нацелены на компьютеры рабочих станций и запускали гостевую ОС внутри ОС хоста путем встраивания гипервизора в модуль ядра, который работал под ОС хоста (гипервизор типа 2). [8]
Были некоторые разногласия по поводу того, можно ли виртуализировать архитектуру x86 без аппаратной поддержки, как описано Попеком и Голдбергом . Исследователи VMware отметили в статье ASPLOS 2006 года , что вышеупомянутые методы сделали платформу x86 виртуализируемой в смысле соответствия трем критериям Попека и Голдберга, хотя и не с помощью классической техники перехвата и эмуляции. [4] : 2–3
Другие системы, такие как Denali , L4 и Xen , пошли по другому пути, известному как паравиртуализация , которая предполагает портирование операционных систем для запуска на полученной виртуальной машине, которая не реализует те части фактического набора команд x86, которые трудно виртуализировать. . Паравиртуализированный ввод-вывод имеет значительные преимущества в производительности, как показано в оригинальной статье SOSP '03 Xen. [10]
Первоначальная версия x86-64 ( AMD64 ) не позволяла осуществлять только программную полную виртуализацию из-за отсутствия поддержки сегментации в длинном режиме , что делало невозможной защиту памяти гипервизора, в частности защиту обработчика ловушек. который работает в адресном пространстве гостевого ядра. [11] [12] : 11 и 20 версии D и более поздние 64-битные процессоры AMD (как правило, изготовленные по техпроцессу 90 нм или меньше) добавили базовую поддержку сегментации в длинном режиме, что позволяет запускать 64-битные процессоры AMD. битные гости на 64-битных хостах посредством двоичной трансляции. Intel не добавила поддержку сегментации в свою реализацию x86-64 ( Intel 64 ), что сделало невозможной 64-битную программную виртуализацию на процессорах Intel, но поддержка Intel VT-x делает возможной 64-битную аппаратную виртуализацию на платформе Intel. [13] [14] : 4
На некоторых платформах можно запустить 64-битную гостевую систему на 32-битной ОС хоста, если базовый процессор является 64-битным и поддерживает необходимые расширения виртуализации.
В 2005 и 2006 годах Intel и AMD (работая независимо) создали новые расширения процессоров для архитектуры x86. Первое поколение аппаратной виртуализации x86 решило проблему привилегированных инструкций. Проблема низкой производительности виртуализированной системной памяти была решена с помощью виртуализации MMU , которая была добавлена в набор микросхем позже.
Основываясь на болезненном опыте с защищенным режимом 80286 , который сам по себе не был достаточно подходящим для одновременной работы приложений DOS , Intel представила виртуальный режим 8086 в своем чипе 80386 , который предлагал виртуализированные процессоры 8086 на чипах 386 и более поздних версиях. Однако аппаратная поддержка виртуализации самого защищенного режима стала доступна 20 лет спустя. [15]
AMD разработала свои расширения виртуализации первого поколения под кодовым названием «Pacifica» и первоначально опубликовала их как AMD Secure Virtual Machine (SVM), [16] , но позже продавала их под торговой маркой AMD Virtualization , сокращенно AMD-V .
23 мая 2006 года AMD выпустила Athlon 64 ( «Орлеан» ), Athlon 64 X2 ( «Виндзор» ) и Athlon 64 FX ( «Виндзор» ) как первые процессоры AMD, поддерживающие эту технологию.
Возможности AMD-V также присутствуют в процессорах семейства Athlon 64 и Athlon 64 X2 с ревизией «F» или «G» на сокете AM2 , Turion 64 X2 и Opteron 2-го поколения [17] и третьего поколения, [18] Phenom и процессоры Phenom II . Процессоры APU Fusion поддерживают AMD-V. AMD-V не поддерживается процессорами Socket 939. Единственные процессоры Sempron , которые его поддерживают, — это APU и настольные процессоры Huron , Regor , Sargas .
Процессоры AMD Opteron, начиная с линейки Family 0x10 Barcelona, и процессоры Phenom II поддерживают технологию аппаратной виртуализации второго поколения, называемую Rapid Virtualization Indexing (ранее известную во время разработки как вложенные таблицы страниц), позже принятую Intel как расширенные таблицы страниц (EPT). .
По состоянию на 2019 год все процессоры AMD на базе Zen поддерживают AMD-V.
Флаг ЦП для AMD-V — «svm». Это можно проверить в производных BSD через dmesg или sysctl и в Linux через . [19] Инструкции в AMD-V включают VMRUN, VMLOAD, VMSAVE, CLGI, VMMCALL, INVLPGA, SKINIT и STGI./proc/cpuinfo
На некоторых материнских платах пользователи должны включить функцию AMD SVM в настройках BIOS , прежде чем приложения смогут ее использовать. [20]
VT-x, ранее носивший кодовое название «Vanderpool», представляет собой технологию виртуализации Intel на платформе x86. 13 ноября 2005 года Intel выпустила две модели Pentium 4 (модель 662 и 672) как первые процессоры Intel с поддержкой VT-x. Флаг ЦП для возможности VT-x — «vmx»; в Linux это можно проверить через /proc/cpuinfo
, а в macOS через sysctl machdep.cpu.features
. [19]
«VMX» означает «Расширения виртуальной машины», которые добавляют 13 новых инструкций: VMPTRLD, VMPTRST, VMCLEAR, VMREAD, VMWRITE, VMCALL, VMLAUNCH, VMRESUME, VMXOFF, VMXON, INVEPT, INVVPID и VMFUNC. [21] Эти инструкции позволяют входить и выходить из режима виртуального выполнения, в котором гостевая ОС воспринимает себя как работающую с полными привилегиями (кольцо 0), но ОС хоста остается защищенной.
По состоянию на 2015 год почти все новые серверные, настольные и мобильные процессоры Intel поддерживают VT-x, за исключением [обновлять]некоторых процессоров Intel Atom . [22] На некоторых материнских платах пользователи должны включить функцию Intel VT-x в настройках BIOS , прежде чем приложения смогут ее использовать. [23]
Intel начала включать в себя расширенные таблицы страниц (EPT), [24] технологию виртуализации таблиц страниц, [25] начиная с архитектуры Nehalem , [26] [27], выпущенной в 2008 году. В 2010 году Westmere добавила поддержку запуска логической процессор непосредственно в реальном режиме – функция, называемая «неограниченный гость», для работы которой требуется EPT. [28] [29]
Начиная с микроархитектуры Haswell (анонсированной в 2013 году), Intel начала включать теневое копирование VMCS в качестве технологии, ускоряющей вложенную виртуализацию VMM. [30] Структура управления виртуальной машиной (VMCS) — это структура данных в памяти, которая существует ровно один раз для каждой виртуальной машины и управляется VMM. При каждом изменении контекста выполнения между различными виртуальными машинами VMCS восстанавливается для текущей виртуальной машины, определяя состояние виртуального процессора виртуальной машины. [31] Как только используется более одного VMM или вложенных VMM, возникает проблема, аналогичная той, которая требует изобретения управления теневой таблицей страниц, как описано выше. В таких случаях VMCS необходимо многократно дублировать (в случае вложенности) и частично реализовывать программно в случае отсутствия аппаратной поддержки со стороны процессора. Чтобы сделать обработку теневых VMCS более эффективной, Intel реализовала аппаратную поддержку теневого копирования VMCS. [32]
Процессоры VIA Nano серии 3000 и выше поддерживают технологию виртуализации VIA VT, совместимую с Intel VT-x. [33] EPT присутствует в Zhaoxin ZX-C, потомке VIA QuadCore-E и Eden X4, аналогичном Nano C4350AL . [34]
В 2012 году AMD анонсировала свой усовершенствованный контроллер виртуальных прерываний ( AVIC ), нацеленный на снижение накладных расходов на прерывания в средах виртуализации. [35] Эта технология, как было заявлено, не поддерживает x2APIC . [36] В 2016 году AVIC доступен на процессорах AMD семейства 15h, моделях 6Xh (Carrizo) и новее. [37]
Также в 2012 году Intel анонсировала аналогичную технологию виртуализации прерываний и APIC , которая на момент анонса не имела торговой марки. [38] Позже он был назван виртуализацией APIC ( APICv ) [39] и стал коммерчески доступен в серии процессоров Intel Ivy Bridge EP , которая продается как Xeon E5-26xx v2 (выпущен в конце 2013 года) и как Xeon E5-46xx v2 (запущен в начале 2014 г.). [40]
Виртуализация графики не является частью архитектуры x86. Технология Intel Graphics Virtualization (GVT) обеспечивает виртуализацию графики как часть графических архитектур новейшего поколения. Хотя APU AMD реализуют набор инструкций x86-64 , они реализуют собственные графические архитектуры AMD ( TeraScale , GCN и RDNA ), которые не поддерживают виртуализацию графики. [ нужна цитация ] Larrabee была единственной графической микроархитектурой , основанной на x86, но она, вероятно, не включала поддержку виртуализации графики.
Виртуализация памяти и ввода-вывода выполняется чипсетом . [41] Обычно эти функции должны быть включены в BIOS, который должен поддерживать их, а также быть настроен на их использование.
Блок управления памятью ввода-вывода (IOMMU) позволяет гостевым виртуальным машинам напрямую использовать периферийные устройства, такие как Ethernet, ускоренные видеокарты и контроллеры жестких дисков, через DMA и перераспределение прерываний . Иногда это называют сквозным соединением PCI . [42]
IOMMU также позволяет операционным системам устранять буферы отказов, необходимые для взаимодействия с периферийными устройствами, адресное пространство которых меньше адресного пространства памяти операционной системы, путем использования трансляции адресов памяти. В то же время IOMMU также позволяет операционным системам и гипервизорам предотвращать угрозу безопасности памяти с помощью ошибочного или вредоносного оборудования .
И AMD, и Intel опубликовали свои спецификации IOMMU:
В дополнение к поддержке ЦП, чтобы его можно было использовать, набор микросхем материнской платы и встроенное ПО системы ( BIOS или UEFI ) должны полностью поддерживать функцию виртуализации ввода-вывода IOMMU. Таким образом можно виртуализировать только устройства PCI или PCI Express , поддерживающие сброс функционального уровня (FLR), поскольку это необходимо для переназначения различных функций устройства между виртуальными машинами. [46] [47] Если назначаемое устройство не поддерживает прерывания, сигнализируемые сообщениями (MSI), оно не должно использовать общие линии прерываний с другими устройствами, чтобы назначение было возможным. [48] Все обычные PCI- устройства, маршрутизируемые через мост PCI/ PCI-X -PCI Express, могут быть назначены гостевой виртуальной машине только все сразу; Устройства PCI Express не имеют такого ограничения.
Виртуализация ввода-вывода с одним корнем PCI-SIG (SR-IOV) предоставляет набор общих (не специфичных для x86) методов виртуализации ввода-вывода на основе собственного оборудования PCI Express (PCIe), стандартизированного PCI-SIG: [50]
В SR-IOV, наиболее распространенном из них, хост VMM настраивает поддерживаемые устройства для создания и распределения виртуальных «теней» их конфигурационных пространств, чтобы гости виртуальных машин могли напрямую настраивать такие «теневые» ресурсы устройств и получать к ним доступ. [52] При включении SR-IOV виртуализированные сетевые интерфейсы становятся напрямую доступными для гостей, [53] избегая участия VMM и обеспечивая высокую общую производительность; [51] , например, SR-IOV обеспечивает более 95% пропускной способности «голой» сети в виртуализированном центре обработки данных НАСА [ 54] и в публичном облаке Amazon . [55] [56]