Виртуализация 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-битных гостевых систем на 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 , которая была добавлена в чипсет позже.
Поскольку Intel 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 ( «Orleans» ), Athlon 64 X2 ( «Windsor» ) и Athlon 64 FX ( «Windsor» ) как первые процессоры AMD, поддерживающие эту технологию.
Поддержка AMD-V также реализована в процессорах семейства Athlon 64 и Athlon 64 X2 с ревизиями "F" или "G" на сокетах AM2 , Turion 64 X2 и Opteron 2-го поколения [17] и 3-го поколения [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 (ранее известную как Nested Page Tables во время ее разработки), позднее принятую Intel как Extended Page Tables (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]
Ранее известный под кодовым названием «Vanderpool», VT-x представляет технологию 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» означает Virtual Machine Extensions (расширения виртуальной машины), что добавляет 13 новых инструкций: VMPTRLD, VMPTRST, VMCLEAR, VMREAD, VMWRITE, VMCALL, VMLAUNCH, VMRESUME, VMXOFF, VMXON, INVEPT, INVVPID и VMFUNC. [21] Эти инструкции позволяют входить и выходить из режима виртуального выполнения, в котором гостевая ОС воспринимает себя работающей с полными привилегиями (кольцо 0), но хостовая ОС остается защищенной.
По состоянию на 2015 год [обновлять]почти все новые серверные, настольные и мобильные процессоры Intel поддерживают VT-x, за исключением некоторых процессоров Intel Atom . [22] На некоторых материнских платах пользователи должны включить функцию VT-x от Intel в настройках BIOS , прежде чем приложения смогут ее использовать. [23]
Intel начала включать Extended Page Tables (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 (GVT) обеспечивает виртуализацию графики как часть более поздних графических архитектур Gen. Хотя APU AMD реализуют набор инструкций x86-64 , они реализуют собственные графические архитектуры AMD ( TeraScale , GCN и RDNA ), которые не поддерживают виртуализацию графики. [ требуется цитата ] Larrabee была единственной графической микроархитектурой на основе x86, но она, вероятно, не включала поддержку виртуализации графики.
Виртуализация памяти и ввода-вывода выполняется чипсетом . [ 41] Обычно эти функции должны быть включены BIOS, который должен иметь возможность их поддерживать, а также быть настроенным на их использование.
Блок управления памятью ввода-вывода (IOMMU) позволяет гостевым виртуальным машинам напрямую использовать периферийные устройства, такие как Ethernet, ускоренные графические карты и контроллеры жестких дисков, через DMA и перераспределение прерываний . Иногда это называется PCI passthrough . [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% пропускной способности сети bare metal в виртуализированном центре обработки данных NASA [54] и в Amazon Public Cloud . [55] [56]