Если серьезно, то «Компьютерра» - единственное неспециализированное и легкодоступное издание, где можно запросто почитать статьи, написанные не журналистами, а самыми что ни на есть учеными. За это огромное спасибо!
Terralab.ru: Раз, два - горе не беда!
Вы когда-нибудь пробовали работать с виртуальными компьютерами - программами, позволяющими запустить из обычной операционной системы одну или несколько «гостевых» операционных систем в виде своеобразных приложений родительской ОС? В одном окошке - Windows 95, в другом - FreeBSD, в третьем - Linux, в четвертом и вовсе какая-нибудь DOS, Minix или MenuetOS, причем все они работают «без отрыва» от Windows XP Professional, в которой это хозяйство запущено.
И не нужно возиться с загрузчиками, создавать три-четыре раздела на жестком диске, решать проблемы совместимости операционных систем с «железом» - специальное ПО сымитирует ровно ту аппаратную конфигурацию, на которой именно эта операционная система запустится и будет функционировать без лишних вопросов. Не нужно перегружаться по десять раз на дню, если настраивать почту в Linux, переносить туда почтовые аккаунты и заниматься их синхронизацией с почтовыми программами Windows совершенно не хочется, а работать со свободной операционной системой по каким-то причинам необходимо. Не нужно опасаться, что неудачно введенная команда в свежеустановленной модной ОСи, написанной на ассемблере, угробит основную установленную на компьютере систему[По известной легенде, ОС Linux родилась в тот момент, когда Линус Торвальдс, нечаянно «позвонил модемом на /dev/hda1 вместо /dev/tty1» и таким образом вывел из строя раздел, на котором размещалась его основная рабочая система Minix. Торвальдс тогда принял вызов, засел за компьютер и в конце концов превратил свой «текстовый редактор» в полноценную POSIX-совместимую операционку. Но, боюсь, желающих повторить этот подвиг среди читателей «КТ» найдется немного]. Но программные комплексы типа VMWare Workstation или Microsoft Virtual PC 2004 - это не только идеальные «полигоны» для экспериментирования и «переходники», позволяющие запускать Windows-приложения из *nix-ориентированных систем или наоборот. Область применения подобных систем гораздо шире
В самом деле: представим на минуту, что мы можем запустить на одном и том же компьютере (персоналке, рабочей станции, сервере) несколько виртуальных взаимодействующих, но непересекающихся машин. Что это нам дает?
Появляется возможность создания сложных «гибридных» систем, вбирающих в себя все преимущества разных операционных систем и наработанного для них программного обеспечения. Хотите поручить управление сетью Windows-машин основанному на Linux серверу, но вас почему-либо не устраивает пакет Samba? Желаете организовать роутер и прокси-сервер на базе *BSD-системы, но для других целей она вам совершенно не подходит? Нет проблем: создаем столько виртуальных систем, сколько нужно, и сочетаем в одном компьютере все их преимущества.
Зачем покупать отдельный сервер, требующий непростого и зачастую дорогостоящего обслуживания, когда с теми же обязанностями может неплохо справиться и десяток персоналок? Минимальная адаптация современных пиринговых сетей - и в локальной сети появляется надежное и дешевое виртуальное хранилище данных, «размазанных» и продублированных на компьютерах самых обычных пользователей. А «виртуальность» образующих эту устойчивую к повреждениям группу машин обеспечит сети надежную защиту от действий пользователей или каких-либо случайных «внешних факторов». Даже если пользовательский ПК, скажем, зависнет, будет взломан хакером, заражен вирусом или перезагружен, - на функционировании работающего на той же самой машине виртуального «сервера» это не скажется.
На сервере работает несколько десятков пользователей с довольно широкими правами и нужно обеспечивать их взаимную безопасность и совместимость? Можно тщательно оптимизировать настройки системы, добиваясь тончайшего и почти неуловимого баланса между обеспечением разнообразных (зачастую экзотических) пожеланий пользователей и ограничением их прав в пределах, гарантирующих, что программы юзера А не будут по субботам вечером «ронять» программы юзера Б. Можно поставить отдельный Windows-сервер, отдельный Linux-сервер, отдельный FreeBSD-сервер, отдельный NetBSD-сервер, отдельный сервер на Solaris или вообще два десятка серверов, по штуке на брата. Но проще и дешевле поставить один сервер, на котором выделить каждому пользователю по «независимой» машине, принципиально непересекающейся с другими.
На предприятии стоит один и только один сервер на базе процессоров Itanium, на котором работает корпоративное ПО, а программисты, за неимением лучшей тестовой платформы, отлаживают свеженаписанные программы и заплатки прямо на «живой» системе? Создадим им виртуальную копию корпоративного «сервера на Itanium», и проблема решится сама собой.
Появляется возможность создания «дешевых» резервных серверов, служащих для замены основного сервера в случае его отказа. Скажем, можно на одном сервере продублировать роутер предприятия четырьмя разными программами.
Уже хорошо, не так ли? А что, если мы добавим к сказанному возможности «ставить на паузу», «сохранять» и «загружать» состояния наших виртуальных машин?
Радикально упрощается процедура бэкапа и процедура переноса рабочего места (или сервера) с одного компьютера на другой (при переезде или замене оборудования). Сохранил - загрузил - все работает, причем с сохранением всех настроек, вплоть до любимого пользователем расположения ярлычков в такой-то папке.
Более того, появляется замечательная возможность, например, без каких-либо проблем загружать виртуальные машины (со всеми документами и настройками) прямо по локальной сети с сервера. Обычно для обеспечения «не-фиксированного рабочего места» (сел за любой компьютер и работаешь с ним, как со своим собственным) применяют разнообразные терминальные решения, обладающие здоровенным перечнем недостатков и ограничений. Загрузка виртуальных компьютеров по сети эту проблему решает.
Ну и, наконец, появляется чудесная возможность всюду носить свое рабочее место и домашний компьютер с собой. Вечером синхронизировал ноутбук с рабочим компьютером - и твое рабочее место словно «переселилось» на ноутбук. А затем, точно так же - на домашний компьютер. И не нужно никакого постоянного широкополосного защищенного подключения.
Впечатляет? На мой взгляд, направление чрезвычайно многообещающее и во многом революционное (ну не зря же им заинтересовалась даже Microsoft). А вот используется оно сегодня крайне редко и в основном энтузиастами, нежели массовыми корпоративными и частными пользователями. Первых отпугивает обилие разнообразных проблем, связанных с существующими софтверными виртуальными ПК[На запрос «VMWare» Google выдал порядка 1 290 000 ссылок, а на «VMWare problem» - 612 000 ссылок. Выводы делайте сами. Желающие могут поставить тот же эксперимент, заменив «VMWare» на «Windows XP», «Linux», «Apache», «MySQL» либо иное другое популярное ПО, и убедиться, что «проблемных» страничек в этом случае получается в несколько раз меньше (15-18%)]; вторых - высокая цена (от 130-300 до пары тысяч долларов за комплект ПО) и общая «тормознутость» и «примитивизм» получающейся на выходе системы. К сожалению, корень зла здесь кроется отнюдь не в «безруких программистах», не умеющих толком отладить свои продукты, нет. Вся загвоздка - в непомерной сложности точного и полного софтверного решения проблемы виртуализации.
Что такое современный x86-совместимый компьютер? Если кто-то скажет вам, что это довольно простая штука, - не верьте: он просто не знает о чем говорит. Примерное представление о масштабах этой, хм, технологии дает разве что техническая документация - четыре многосотстраничных тома краткой документации по архитектуре IA-32 (The IA-32 Intel Architecture Software Developer’s manuaname = "note" vol. 1, 2A, 2B amp; 3) и еще два - по ее 64-битным расширениям (The Intel Extended Memory 64 Technology Software Developer’s guide, vol. 1 amp; 2). Впрочем, о последних лучше почитать в первоисточнике - пятитомном издании AMD64 Architecture Programmer’s Manual. Реализовать по этим здоровенным талмудам даже простую имитацию современного x86-процессора - огромная работа; и еще труднее - сделать такую имитацию, которая бы умела более или менее эффективно задействовать для исполнения виртуального кода ресурсы центрального процессора. Даже куда более простая и специально оптимизированная виртуальная машина Java, как известно, работает довольно медленно; надеяться же на чистую эмуляцию средствами центрального процессора чего-либо принципиально более мощного, нежели какой-нибудь ZX Spectrum на процессоре Z80, и вовсе не приходится. Поэтому все современные виртуальные компьютеры идут другим путем - не эмулируя в прямом смысле слова несколько виртуальных ПК, а запуская на одном персональном компьютере несколько операционных систем и ловко «дурача» их, с помощью разных приемов защищая от взаимного «членовредительства» и заставляя «поверить» в то, что кроме них в системе никого нет (рис. 1). Беда в том, что каких-либо приспособлений для подобного рода «надувательства» у этих «виртуализаторов» нет - им приходится выкручиваться, используя для своих целей стандартные методы (IA-32 aka 32-разрядный x86 - весьма гибкая архитектура, и во многих отношениях сделать это оказывается возможным). Однако предусмотреть все ситуации и найти ответы на все возникающие при этом вопросы - практически нереально. Разные ухищрения, на которые приходится пускаться программистам, к сожалению, являются скорее латанием дыр в ветхом днище корабля: для того чтобы кое-как, с половинным ходом доплыть до дока, такого «ремонта» хватает, а вот для длительных морских походов или бурных морей - нет.
Рассмотрим суть возникающих неприятностей на примере так называемой проблемы нулевого кольца исполнения. Кольца (rings, они же уровни приоритета - PLs, Priority Levels) - это такая хитрая система, защищающая центральный процессор от выполнения «посторонними» программами «глубоко системных» инструкций и операций, эдакий «уровень доступа» запущенной программы к системным ресурсам. В IA-32 четыре кольца, от Ring 0 до Ring 3. Чем больше номер кольца - тем меньше приоритет и тем меньше доступно работающей программе. В нулевом кольце запущенный процесс может делать все, что заблагорассудится, - ему предоставлен карт-бланш на любые операции; так что именно в этом кольце «обитает» ядро операционной системы и непосредственно взаимодействующие с оборудованием драйверы. Третье кольцо - сильно упрощенный и ограниченный мирок, в котором запущенный процесс может свободно «жить», но изменить который он не в состоянии. Здесь «живут» всяческие прикладные программы. Кольца 1 и 2 ни Windows, ни *nix-системами принципиально не используются.
В чем же проблема? Оказывается, когда мы «дурачим» виртуальную операционную систему, то не совсем понятно, в какое из колец ее следует помещать. В Ring 0, очевидно, поместить ОС нельзя - проконтролировать ее действия в этом случае не сумеет ни одна живая душа, ибо «воля» исполняющегося в этом кольце кода обсуждению или критике со стороны процессора не подлежит. Поместить операционную систему в «непривилегированные» первое, второе или третье кольца тоже нельзя: любая ОС проектируется, исходя из расчета, что выполняться она будет в нулевом кольце привилегий, а значит, отсутствия необходимого минимума маленьких, но жизненно важных для работы ее ядра инструкций не простит. Вот и приходится программистам либо заблаговременно проверять код на предмет «неблагонадежных» инструкций, ставя на их место вызовы «правильных заменителей», либо отлавливать возникающие при исполнении «неправильных» инструкций ошибки и пытаться их на лету исправлять. Легко догадаться, что реализация и того и другого выливается в большую головную боль для программистов, причем на вроде бы совершенно пустом месте. К примеру, часто «гостевую» операционную систему размещают в неиспользуемом первом кольце… но в расширенном 64-битном режиме процессор не поддерживает кольца 1 и 2, так что все соответствующие наработки «виртуализатор», естественно, отправляет в корзину. Рано или поздно количество проблем переходит в качество - и виртуальные машины становятся не только крайне сложными с программной точки зрения, но и громоздкими, медленными и ненадежными.
Так что же делать? Отказаться от надежды на массовый виртуальный ПК? Конечно, нет! Как минимум, вместо того, чтобы заниматься замысловатой оптимизацией кода для хитроумного обмана операционной системы, можно просто внести некоторые изменения собственно в ОС, видоизменив «наиболее мешающиеся» части ядра. Подобный подход называется паравиртуализацией, он активно продвигается компанией Sun и поддержан движением OpenSource… но эту красивую картинку, к сожалению, успешно портит своими «незаменимыми продуктами» великая и ужасная Microsoft, ибо адаптировать сверхпопулярное ядро Windows NT к реалиям конкретной виртуальной машины может, естественно, только его автор; но так, как делать этого софтверный гигант не собирается (слишком уж многое нужно перелопачивать в ядре), то и сам подход получается если не тупиковым, то, по крайней мере, неполноценным. Поэтому куда интереснее второй, гораздо более простой и универсальный способ - аппаратная поддержка функционирования менеджеров виртуальных компьютеров со стороны процессора, то есть технологии виртуализации. Именно так и поступила Microsoft, разработав в тесном сотрудничестве со специалистами VMWare систему, снимающую основную «головную боль» с разработчиков соответствующего ПО.
Центральная идея Intel Virtualization Technology (ранее известной под названием Vanderpool) - введение в процессор аппаратной поддержки некой специализированной программы - менеджера виртуальной машины (VMM, Virtual Machine Manager) (рис. 1). В принципе, VMM - по всем статьям обычная программа, работающая на персональном компьютере. Однако «права» у этой «обычной» программы самые невероятные, поскольку она может вмешиваться во все мало-мальски значимые события, происходящие в процессоре. То есть, если, скажем, ядро операционной системы (работающее в обычном, ничем не ограничиваемом Ring 0) вызывает инструкцию CPUID, или читает-записывает важный системный регистр CR[Что, впрочем, неудивительно - AMD сегодня отвоевывает себе «место под рыночным солнцем», а для этого ей необходимо предлагать более совершенные и интересные решения], или произошло какое-то внешнее событие, вроде прерывания - то процессор сообщает об этом VMM и… больше ничего не делает, предоставляя VMM право реагировать на возникшее событие самостоятельно. Менеджер виртуального ПК «разбирается» в происходящем, решает, как поступить (например, может, необходимо после нажатия какой-то кнопки переключить CPU на другую запущенную операционную систему), и «программно» имитирует действия центрального процессора в подобной ситуации. Причем отслеживать разные события ему приходится довольно интенсивно: «вручную» маршрутизировать обращения операционных систем к периферийным устройствам, «вручную» загружать и переключать запущенные операционные системы, «вручную» следить за виртуальной памятью запущенных операционных систем, чтобы последние нечаянно не «покалечили» друг друга, считая себя единственными претендентами на имеющиеся физические ресурсы.
Последний пример хорошо иллюстрирует суть происходящего. Как известно, современные многозадачные операционные системы активно используют механизм виртуальной памяти, когда запущенные на процессоре программы работают с «линейными» адресами, произвольным образом отображенными в реальную физическую оперативную память (или еще куда-нибудь - например, на участок жесткого диска в своп-файле или своп-разделе). С физической памятью не работает даже сама операционная система: слишком уж это неудобно - подстраиваться под особенности конкретного ПК, и слишком опасно - когда в общей куче перемешаны данные десятков и сотен запущенных программ, и только аккуратность разработчика защищает эти данные от ошибочных действий программного обеспечения. Преобразование виртуальных «линейных» адресов в физические обычно выполняет сам центральный процессор, для чего у него предусмотрена специальная таблица трансляции адресов, в которой записано, какому «линейному» адресу какой физический соответствует (или стоит пометка, что при обращении к данному участку памяти процессору следует позвать на помощь операционную систему). Хранится эта таблица не в регистрах процессора, а в оперативной памяти (в виде трех-четырехуровневого B-дерева, если вас интересуют подробности), причем таблиц может быть сколько угодно: для переключения к другому виртуальному адресному пространству в процессоре достаточно изменить один-единственный регистр CR3 (указатель на таблицу трансляции) и выполнить специальную команду сброса и очистки кэшей CPU, в которых может сохраняться старая информация о виртуальной памяти. «Простым смертным» в лице обычных программ доступ к CR3, разумеется, закрыт, и поэтому изменить «мир», в котором программы находятся, они могут только путем обращения за помощью к операционной системе. Операционной системе «проще» - она, с одной стороны, подчиняется «общим правилам», а с другой - может эти правила самостоятельно «переписывать», работая ровно в тех условиях, которые кажутся ей наиболее приемлемыми. Скажем, если ОС срочно потребуется записать что-то по физическому адресу 0x00123456, она вначале создаст в таблице трансляции своих виртуальных адресов ссылку на соответствующий участок оперативной памяти (отобразив его в то место виртуального линейного пространства ОС, которое покажется ей самым удобным) и затем обратится по свежесозданному виртуальному адресу. Для «обычного» же процесса (который, строго говоря, почти ничем не отличается от процесса ядра операционной системы) подобная «лазейка» к, скажем, «соседям» по компьютеру закрыта - ему просто-напросто не дадут увидеть собственную таблицу трансляции, выведя ее за пределы «видимости» виртуального пространства его памяти либо защитив эту область памяти от записи (здесь тоже используется та самая таблица трансляции - в ней можно указывать права доступа к виртуальным адресам). Все замечательно, все удобно, никаких проблем.
Но стоп, - скажет здесь читатель, - а что же будет, если мы запустим две операционные системы и одна из них решит отобрать для своих целей кусочек физического, а не виртуального пространства памяти другой операционной системы, отобразив его в своей таблице трансляции? В обычных условиях это фатальная ошибка, которая быстро приведет две совместно работающие операционки к краху. Но если у нас есть VMM, то ситуация в корне меняется, ибо мы теперь можем запущенную операционную систему «одурачить», перехватив соответствующее обращение и подсунув ей не настоящий CR3, а специально подготовленную «пустышку». ОС, наивно полагая, что она полностью контролирует виртуальную память компьютера, на самом деле будет всего лишь изменять никак не связанную с настоящей таблицей трансляции область оперативной памяти. А обращения к ней, используя стандартные же механизмы виртуальной памяти, будет перехватывать все тот же VMM и синхронизировать в соответствии с ними настоящую таблицу трансляции. Красиво придумано, не правда ли? Собственно виртуальной машины у нас нет, просто мы тщательно контролируем работу операционной системы и при необходимости ловко манипулируем ею.
Набор ситуаций, «прерывающих» выполнение обычных программ и приводящих к вызову VMM, довольно гибко настраивается - вовсе не обязательно, скажем, реагировать на все обращения операционных систем к компьютерным портам ввода-вывода: достаточно указать, какие порты для какой операционной системы будут «выбрасывать» ее к VMM, а какие - работать как если бы VMM не существовало в природе. Причем догадаться о том, что ОС запущена «под неусыпным контролем», практически невозможно: VMM может, например, точно таким же образом фальсифицировать обращения к CPUID (информация о процессоре и поддерживаемых им технологиях), после чего запущенная на Pentium D операционная система будет искренне полагать, что работает, скажем, на Pentium 3 и что никакой поддержки технологий виртуализации этот процессор не предоставляет.
Фальсифицируется все - даже время. Для «подделки» данных счетчика тактов TSC (Time Stamp Counter) в Vanderpool, например, предусмотрен даже не один, а целых два способа - автоматический (к значению TSC прибавляется заданная VMM константа) и «ручной» (перехватываются обращения к RDTSC); аналогично нетрудно перехватить и обращение ОС к системному таймеру с запросом текущего времени. Эдакое «1984» в рамках одного конкретно взятого процессора с VMM в роли Министерства Правды.
В качестве завершающего штриха в описании Vanderpool Technology (VT) приведем блок-схему, поясняющую функционирование технологии и назначение десяти (да-да, всего десяти!) входящих в нее инструкций (рис. 2). Заметим также, что все вышесказанное относилось к варианту VT-x для x86-совместимых процессоров. Кроме нее существует слегка отличающаяся VT-i для процессоров Itanium, но работает она по тем же самым принципам, так что останавливаться на ней я не буду.
Компьютерный мир помешался на совместимости: процессоры Intel и AMD сегодня поддерживают практически идентичные наборы инструкций, а «заклятые друзья» ревниво следят за тем, чтобы процессор конкурента никаких заметных преимуществ перед «родным» процессором не имел. Так, AMD скопировала у Intel набор инструкций SSE (1/2/3); Intel у AMD - 64-битную технологию AMD64 и входящий в ее состав NX-бит: называются они по-разному (SSE у AMD превратилась в 3Dnow! Professional; AMD64 у Intel - в EM64T), но большого значения для ПО это, по сути дела, не имеет. Просто есть некий софт (оптимизированный под SSE ли, под AMD64 - неважно), и производители процессоров стараются сделать все возможное, чтобы этот софт (независимо от того, для какого процессора он разрабатывался) мог запускаться и на их CPU. Из-за этих-то пресловутых требований совместимости до сих пор живет архитектура x86, создававшаяся скорее для микропроцессоров («ноги» i8086 растут из предназначавшегося для калькуляторов i8080) и крайне неудобная для любых современных процессоров (что Athlon, что Pentium вынуждены ее «на лету» преобразовывать в более подходящий для обработки формат). «Хоронили» ее по меньшей мере трижды - в связи с выходом процессоров «правильных» архитектур. Однако ж некогда процветавшие ветви RISC-машин сегодня зачахли, архитектура VLIW не получила должного распространения, а x86 и поныне «живее всех ее хоронивших» - колоссальный парк ПО, накопленного для этой архитектуры, сделал ее практически «непотопляемой». И в свете этого полная несовместимость технологий виртуализации от AMD и от Intel звучит как гром среди ясного неба.
Концептуально - перед нами все тот же выделенный менеджер виртуальных машин с широкими возможностями для перехвата управления у обычных операционных систем и неограниченными правами доступа. Практически - 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-контроллер может проверять, разрешено ли устройству из такого-то домена чтение данных из такой-то области памяти.
Наконец, AMD уже сегодня предоставляет основную часть возможностей еще даже неопубликованной технологии защиты данных Intel LaGrande, а именно - «безопасный» запуск виртуальной операционной системы. Не зря же Intel называет свою технологию VT, а AMD свою - SVM (Security amp; Virtual Machine). Если быть более точным, то специальная инструкция SKINIT позволяет процессору запускать гарантированно безопасный загрузчик - крошечный (64 Кбайт) кусочек подписанного цифровой подписью кода, который затем может проверить и загрузить «безопасный» VMM или «безопасное» ядро обычной операционной системы. Сам загрузчик проверяется специальным аппаратным модулем TPM (которые уже активно устанавливаются в серийные материнские платы), ну а дальнейшая проверка надежности загружаемого этим загрузчиком кода - целиком и полностью лежит на собственно загрузчике. В результате появляется возможность настроить компьютер так, чтобы загружающийся при старте компьютера VMM и (или) запускаемые им операционные системы соответствовали некоторому заданному и аппаратно прошитому «стандарту» (это, например, может гарантировать, что обладающий широчайшими возможностями VMM не станет «шпионить» за клиентским ПО, а на «брэндовом» компьютере запустится только подписанная лицензионная копия MS Windows).
AMD Pacifica пока не в полной мере поддерживает виртуализацию устройств ввода-вывода (как распределить между виртуальными операционными системами реальную периферию - головная боль VMM), как и не в полной мере обеспечивает безопасность каналов ввода-вывода (проще говоря, от подцепленного к периферийному кабелю «жучка» такая защита не спасает), однако все равно можно утверждать, что все принципиально важные вопросы защиты операционных систем и эффективной виртуализации она решает. У корпорации Intel в последнее время и без того хватает неудач, так что я бы очень хотел написать, что черная полоса для нее уже закончилась и анонсированная гораздо раньше конкурента технология виртуализации позволяет ей наконец-то вырваться вперед, но… Да, Vanderpool - замечательная технология, однако Pacifica обходит ее по всем основным показателям.
Не будем сейчас затевать споры о том, чье решение лучше и перспективнее. Со своей главной задачей - запуском произвольного количества виртуальных операционных систем и обеспечением их эффективной одновременной работы - справляются обе технологии, а за Intel стоит все-таки больший сегмент рынка. Вариант AMD смотрится гораздо интереснее, однако для поддержки всех своих возможностей он требует специально заточенных «под AMD» менеджеров виртуальных операционных систем, принципиально несовместимых с Intel Virtualization Technology. Чтобы совсем уж явно не проводить «водораздел» между VMM «для Intel» и «для AMD» (все-таки VMM - очень сложное и трудоемкое программное обеспечение), в Pacifica предусмотрен специальный, скажем так, «режим совместимости» SPT, в котором двойная трансляция адресов виртуальной памяти отключена и VMM «для Intel» можно с небольшими переделками превратить в «урезанный» VMM «для AMD»[Который, правда, даже в таком варианте получается более совершенным и «интересным», нежели Vanderpool. Инженеры AMD, как обычно, сделали все, чтобы обойти коллег из Intel]. Клиентское ПО и операционные системы переделывать не придется и подавно: с «потребительской» точки зрения VMM в компьютере вроде бы как и не существует.
Первые процессоры Intel с поддержкой VT-x должны появиться уже в этом году: по крайней мере, в начале года обещания о поголовной «виртуализации» Pentium 4 прозвучали, а новые семейства чипсетов i945-i955 эту технологию поддерживают уже сейчас. Правда, судя по срокам анонса VT-x для процессоров Xeon (первый квартал 2006 года), возможно, мы увидим эту технологию только в 65-нм процессорах Intel. Зато как в десктопных, так и в мобильных: будущий двухъядерный Pentium M «Yonah» будет поддерживать Vanderpool. Технология VT-i тоже должна появиться в новых процессорах Itanium 2 в конце этого года.
AMD обещает поддержку Pacifica в своих новых процессорах начиная с первого квартала следующего года - а именно в Athlon 64, предназначенных для Socket M2 и рассчитанных на использование оперативной памяти DDR2. Тогда же Pacifica появится и в серверных процессорах Opteron.
С менеджерами VMM, которые фактически должны стать обязательным дополнением к операционной системе для ПК, все куда туманнее - своих решений пока не представил ни один из вендоров. Хотя, без сомнения, VMM наверняка выпустят компании Microsoft, VMWare и кто-нибудь из сообщества OpenSource. Кстати, последнему, вероятно, будет светить самое радужное будущее - даже если Microsoft, как обычно, сделает свой продукт бесплатным.
ОГОРОД КОЗЛОВСКОГО: Синусоида
Давний главный редактор «Компьютерры» Георгий Борисович Кузнецов попал однажды в довольно замысловатую ситуацию, которую, разрешив, и описал. Крутой по тем временам американский модем Георгия Борисовича (Courrier, сколько помнится) стал вдруг, ни с того ни с сего, рвать связь. Чего только Кузнецов ни проверил тогда, чего ни перепробовал, пока ему не пришло в голову взять в руки вольтметр и померить напряжение в электрической сети. Оно оказалось где-то в районе 205 вольт, и заморский модем принял это за свинство, в условиях которого ни один порядочный прибор работать не станет. Хотя бы по чисто принципиальным соображениям.
Конечно, система Георгия Борисовича была подключена к электросети через источник бесперебойного питания (ИБП или, по-ихнему, UPS), однако через простенький, так называемый линейно-интерактивный. А линейно-интерактивные ИБП, когда напряжение в сети наличествует, работают так: они пропускают электричество сквозь себя как оно есть (отбирая по мере необходимости капельку мощности для подзарядки аккумулятора), а если напряжение заметно падает или заметно же поднимается (процентов на двадцать от номинала), - включают так называемый бустер, который повышает его или же понижает. Бустер представляет собой обычный трансформатор с цельной первичной обмоткой и составной вторичной: когда напряжение надо повысить, добавочная обмотка подключается ко вторичной прямо, когда понизить - противотоком. В связи с чем, как правило, настроить величину этих процентов линейно-интерактивный ИБП не позволяет. Поэтому, когда напряжение падало не на двадцать процентов, а, положим, на девятнадцать, - его ИБП и пропускал. И модем - бунтовал.
Георгий Борисович вышел тогда из положения, купив заметно более дорогой ИБП следующего класса, так называемый on-line, и проблема решилась. Естественно: ведь on-line UPS действуют совсем иначе: независимо от входного напряжения, они преобразуют его в постоянные 12 вольт, после чего вторым преобразователем из 12 делают снова 220. И на выходе мы получаем точно нужную величину, потому что 12 вольт уже стабилизированы. Что же касается формы сигнала получаемого переменного тока, - она зависит от схемотехники второго преобразователя и может как быть прямоугольной, так и, благодаря дополнительным электротехническим навескам, в той или иной степени приближаться к синусоиде.
Что касается меня, - то ли мне больше повезло с местом жительства (хотя это вряд ли), то ли - с аппаратурой, менее склонной к алиментарной дистрофии, - так или иначе, мой простенький линейно-интерактивный ИБП от московской фирмы NeuHaus (corp.nhs.ru, где их делают на самом деле, я не в курсе; где-то, кажется, на Тайване) исправно проработал лет шесть или семь и никаких проблем мне не создал.
Но тут случилось в Москве знаменитое веерное отключение. Слава богу, мой район оно не задело, - однако целую неделю после этого электричество у меня дома… мигало. То есть вырубалось на какую-то секунду, а то и ее долю. И вот за эту секунду мой компьютер успевал выпасть в нуль, что несколько раз привело к потере дорогих для меня результатов творческой работы. Все стало понятно после первого же мигания: вот уже, наверное, несколько месяцев мой ИБП работал в режиме, что называется, шунта. Это меня, конечно, огорчило, но не удивило: срок жизни любого кислотного аккумулятора, вроде автомобильного (а в ИБП именно такие и применяются), исчисляется несколькими годами (по автомобильному опыту - пять лет - максимум), так что Бобик сдох в положенный срок. Горько вздохнув, я полез в Интернет и буквально в тупик стал от обилия предложений, выбрать из которых было совершенно невозможно, ибо по сопутствующей предложениям информации понять разницу между устройствами от разных производителей или разницу между моделями одного производителя было практически невозможно. Единственное, на что я ориентировался, - это на принцип работы (поскольку on-line-способности за эти годы не понадобились мне ни разу, - я решил и не переплачивать вдвое) и поддерживаемую мощность. На моем старом она была 600 ВА, и ее, по общему впечатлению, вполне хватало.
В общем, считается, что стандартный компьютер со стандартным же ЭЛТ-монитором (мелочевку вроде модемов или сканеров в расчет можно не брать или положить на них 5-10 процентов общей мощности) легко умещается в 500 ВА, - но мой компьютер не вполне стандартный и может съесть несколько больше.
(Забегая вперед, скажу, что новый ИБП поддерживает мощность в 800 ВА и умеет замерять ее практический расход. В результате этих замеров я понял, что моя система в нормальном, легком режиме отнимает у ИБП около 65 процентов его возможностей, а когда процессор работает на полной мощности - как, например, в случае видеорендеринга - и вентиляторы охлаждения раскручиваются вовсю, - до 80-85 процентов.)
Итак, ничто в Интернете меня особо не привлекло, и я рискнул позвонить в сервис-центр NeuHaus’а в слабой надежде на то, что, хоть модель моего ИБП по нынешним меркам почти антикварная, - вдруг да найдутся аккумуляторы на замену. И когда выяснилось, что «никаких проблем - конечно, найдутся, и стоить это будет меньше 15 (!) долларов», - я решил не искать добра от добра[Впрочем, Сережа Леонов уверяет, что аккумуляторы во всех ИБП стандартные, продаются на любом рынке по цене примерно 10 долларов и меняются даже проще, чем в авто. Но сэкономленные на этом деле два-три доллара, вероятно, ушли б на бензин до рынка, да и время чего-то все-таки стоит!]. Но когда привез свой ИБП в NeuHaus, встретил там старого знакомого Валеру Суханова, их PR-менеджера, и он мне предложил поменять не батареи, а сам ИБП: на новую модель, полную технологических изюминок. На что я, естественно, с удовольствием согласился.
Новая модель тоже была из класса линейно-интерактивных (забавно, что и старую, мою, называемую SmartLine, они до сих пор с продаж не сняли) и называлась SmartUltra, причем мне предложили младший в линейке, 800-вольтамперный вариант (а линейка тянется аж до 3000 ВА), которого, впрочем, должно было хватить - и хватило! - с запасом. Сам корпус оказался несколько больше, но все же, хоть впритык, а уместился на старое место в нижней нише компьютерного столика. Две RJ-розеточки для защиты от всплесков напряжения телефонной линии остались на месте, зато «питательных» разъемов прибавилось с четырех до шести. Но, пожалуй, главное - что над кнопочками и светодиодиками передней панели появился большой, внятный и яркий, с модно-голубой подсветкой жидкокристаллический экран. Он показывает уровень заряда батареи, уже упомянутый мною процент использования мощности, а также состояние бустера (если он включен на повышение, на экране возникает линия с подъемом, если на понижение - соответственно со спуском) и постоянно, назойливо мигает по поводу отсутствия заземления (старый делал это куда менее настырно, зажигая красный светодиод на задней стенке, которого, по счастью, не было видно). У более мощного SmartUltra, говорят, на дисплее можно еще увидеть и количество минут, оставшихся до полного истощения аккумуляторов.
Последнее из замеченных мною приятных изменений - это возможность подключиться к компьютеру для обратной связи не только по традиционному для ИБП COM-порту, но и по USB. Забавно, что во встроенной в Windows ХР «питательной» закладке такая идея не предусмотрена вовсе: предлагается выбирать только из COM-портов! Кстати, емкости свежей батареи хватает на спокойную работу моей системы в течение двенадцати-четырнадцати минут, чего, как вы понимаете, с головой хватает, чтобы запомнить данные и не наплодить на винчестерах потерянных кластеров. Позволяет SmartUltra и так называемый холодный старт, что, впрочем, для ИБП давно уже не новость.
Больше того: на задней стенке устройства стоит рядок DIP-переключателей, которые, согласно приклеенной рядом табличке, позволяют задавать параметры выходного напряжения, - правда, только при работе от батареи: от 220 до 240 вольт.
Но ребята из NeuHaus едва ли не главной изюминкой SmartUltra считают «синусоидальную выходную характеристику». Я даже ухо прикладывал к новому ИБП, чтобы выяснить, не стоит ли там классический генератор, дающий эту самую классическую синусоиду, но шума подшипников не обнаружил (шутка). Конечно, получить синусоиду вместо череды прямоугольников сложнее, и требует это добавочных электротехнических и чисто электронных элементов, которых, при вскрытии корпуса, оказалось прямо-таки неожиданное множество[Собственно синусоиду формирует посредством широтно-импульсной модуляции единственный PIC-микроконтроллер - С. Л.], и, соответственно, затрат (что отчасти, наверное, повинно и в цене SmartUltra - около 200 баксов по price.ru: ровно посерединке между средними ценами на «прямоугольные» линейно-интерактивные и on-line-ИБП), но возникает вопрос: а на фиг она, синусоида, в данном контексте нужна? Ведь импульсным блокам питания компьютерной техники вообще все по барабану: частота, переменность-постоянность, полярность, форма напряжения… Они все равно все выпрямляют и сглаживают, после чего и используют.
В буклете NeuHaus на этот вопрос отвечают так: она позволяет держать SmartUltra для питания видео/аудиоаппаратуры. Спору нет, сегодня, когда всяческих видеорекордеров развелось, как тараканов, порой может стать обидно, если из-за неполадок с электричеством прервется назначенная (а еще обиднее - уже идущая) запись. Да и если музыку слушаешь, не хочется прерываться посередине трека. Но вся современная аудио/видеоаппаратура применяет ровно такие же (по принципу) импульсные блоки питания, как и аппаратура компьютерная, - так что и ей синусоида по барабану[Среди известных мне устройств, критичных к синусоиде - тиристорные регуляторы ламп накаливания - С. Л.]. Ну, разве что речь пойдет о чем-нибудь устаревшем, в сущности антикварном, с блоком питания трансформаторным (среди которого уж видео-то рекордера точно не найдешь!), или о компьютерных колонках (их блоки питания практически всегда трансформаторные, но отнести их к разряду видео/аудиоаппаратуры можно лишь с очень и очень большой натяжкой, хотя все равно - приятно).
Пожалуй, единственный выигрыш, который на сегодня теоретически можно получить от чистой синусоиды, - отсутствие импульсных наводок от силовых проводов питания на провода сигнальные.
И самое главное - очень трудно провести реальный эксперимент: запитать десятка два разного класса усилителей от ИБП с прямоугольничками и от ИБП с синусоидой и послушать с завязанными глазами. Впрочем, если NeuHaus возьмет на себя организацию серии таких слепых тестов - с огромным любопытством приму в них участие.
ТЕМА НОМЕРА: Хорошо забытое новое
В начале этого года разработчики были разбужены новостью о рождении «нового веба». Привыкшие скептически воспринимать бурные восторги, программисты глянули в корень и решительно заявили, что пользуются всеми этими «революционными» технологиями уже несколько лет. Основатель американской компании Adaptive Path, который поднял весь этот шум, еле успевал уворачиваться от упреков, язвительных замечаний и «вопросов на засыпку».
Речь идет о подходе, который с легкой руки американцев получил название AJAX. Если верить Adaptive Path, это слово - вовсе не попытка придумать звучное название для торговой марки, под которой можно было бы продвигать «новый веб». Просто использовать короткое название гораздо удобнее, чем зачитывать длинный перечень технологий, которые образуют AJAX. Название можно расшифровать на понятном английском языке: Asynchronous JavaScript + XML. Это не отражает всего набора используемых технологий, но дает представление о сути.
Сторонники AJAX утверждают, что в самом ближайшем будущем мы увидим новый Интернет. Пользователи забудут о белых страницах в браузерах и нервном постукивании пальцами в ожидании загрузки. Сайты избавятся от своей обычной заторможенности и научатся гораздо быстрее реагировать на наши действия. Наконец, мы почти забудем слово «веб-приложение», потому что, скажем, работа с почтовым ящиком через веб-интерфейс будет протекать столь шустро и необременительно, что пользователя начнут охватывать сомнения, не запустил ли он по ошибке какой-нибудь Outlook или The Bat!.
Тем не менее скептики упрямо напоминают, что у «революционных идей» солидный возраст, что, мол, годы уже не те, чтобы строить планы «мирового господства». Если бы этой идее было действительно суждено перевернуть Сеть с ног на голову, то это бы уже давным-давно произошло. А так AJAX не больше чем очередной рекламный пшик, которым вознамерилась «пропиариться» некая компания из Сан-Франциско.
Однако все эти размышления - лишь гадание на кофейной гуще. Между тем нашумевший подход взяла на вооружение Google, и AJAX быстро стал частью интернет-действительности.