Выбрать главу

Концептуально - перед нами все тот же выделенный менеджер виртуальных машин с широкими возможностями для перехвата управления у обычных операционных систем и неограниченными правами доступа. Практически - Pacifica проще, функционально богаче и «дружественнее» к разработчику VMM3 (рис. 3). Судите сами: например, можно отказаться от хитроумной и трудоемкой технологии подмены таблиц трансляции виртуальной памяти, используя двухуровневые таблицы. Обычно в таблице трансляции виртуальной памяти записываются физические адреса, но ведь там можно хранить и виртуальные адреса «второго уровня», для которых тоже будет существовать своя, определяемая исключительно VMM, таблица. То есть так же, как операционная система обеспечивает запущенным в ней программам персональные «линейные» участки виртуальной памяти, VMM просто-напросто предоставляет каждой из запущенных операционок свою «виртуальную физическую» оперативную память. И точно так же, как обычная программа не замечает подвоха в работе оперативной памяти, «одураченная» операционная система не будет подозревать, что работает она не в физическом, а в виртуальном адресном пространстве. Не нужно ничего отлавливать, перехватывать и синхронизировать - все происходит в автоматическом режиме, без малейших усилий со стороны VMM. Не совсем понятно, почему Intel отказалась от этого очевидного и радикально упрощающего жизнь программистам шага, однако в текущем варианте несчастные программисты у Intel фактически вынуждены будут дублировать основную функциональность ядра операционной системы (в вопросах, касающихся управления памятью).

Вторая принципиальная «фича» AMD’шной виртуализации - это Tagged TLB, тегированный кэш трансляции виртуальных адресов. TLB представляет собой буфер, позволяющий процессору не заниматься каждый раз чрезвычайно трудоемкой и медленной процедурой преобразования виртуального адреса в физический, а сделать это единожды и впоследствии быстро обращаться к уже вычисленным парам соответствия «виртуальная память - память реальная». Понятно, что при каждом переключении от одной программы к другой (не говоря уже о переключении от одной операционной системы к VMM и обратно), когда процессору приходится переключаться между разными виртуальными пространствами памяти, этот буфер со всей ранее накопленной информацией приходится сбрасывать - в новом виртуальном пространстве старым виртуальным адресам будут соответствовать совсем другие «физические». А значит, каждое переключение к VMM и обратно - это вопиющее расточительство процессорных ресурсов, десятки и сотни тысяч потраченных на восстановление потерянной информации тактов. В реализации AMD буфер TLB запоминает, какой из виртуальных операционных систем какой адрес принадлежит. В обычной ситуации запоминать эту информацию бессмысленно - при переключении задач TLB все равно быстро заполнится новыми адресами, вытесняющими старые; а вот для быстрого переключения от OS к VMM и обратно (когда, возможно, работа VMM не займет и сотни тактов процессорного времени) подобная оптимизация приходится как нельзя более кстати.

Следующий приятный «пунктик» в программе AMD - аппаратная защита контроллера DMA. В обычных условиях этот контроллер позволяет периферийным устройствам работать с оперативной памятью, не привлекая центральный процессор. Например, CPU может не заниматься рутинной и монотонной задачей передачи данных неторопливому винчестеру, а скинуть всю необходимую для сохранения информацию в оперативную память, сообщить жесткому диску, что, откуда и куда сохранять из памяти на диск - и, не дожидаясь окончания этой операции, заняться каким-либо другим делом. Это удобно, это быстро, но в то же время это грандиозная дыра в безопасности в тех случаях, когда две операционные системы, запущенные на одном компьютере, требуется изолировать друг от друга. Ведь никаких проверок на то, что периферийное устройство может запросить совершенно «левый» адрес физической оперативной памяти (если, допустим, по некоей договоренности между драйвером и устройством, по во-о-он тому физическому адресу вроде бы ничего не должно располагаться и его можно использовать как вспомогательный буфер при работе), DMA обычно не производит. Специалисты AMD это упущение исправили - теперь все устройства могут быть разбиты на несколько виртуальных доменов (изначально - по четыре домена на каждый процессор), а DMA-контроллер может проверять, разрешено ли устройству из такого-то домена чтение данных из такой-то области памяти.