новости
статьи
.технологии

о возможных подходах к разработке средств виртуализации для смартфонов

введение

В настоящее время наблюдается бурное развитие технологий виртуализации операционных систем, позволяющих получить все многообразие программных платформ пользователя на единой аппаратной платформе вне зависимости от ее типа. Всплеск популярности вызван в первую очередь возросшими вычислительными возможностями аппаратуры, а также наличием значительного количества системного программного обеспечения с открытым исходным кодом, что облегчает его изучение и модификацию.

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

зачем?

Использование виртуализации в вычислительных системах может быть продиктовано различными причинами. Наиболее распространенная цель ее применения на серверах - консолидация сервера - обосновывается тем, что при виртуализации нескольких загруженных не до конца систем на одном сервере возможен выигрыш в мощности, пространстве, охлаждении и администрировании из-за наличия меньшего количества физических серверов. Поскольку определить степень использования сервера может оказаться не так просто, возможна поддержка технологий виртуализации, называемой оперативным перемещением или горячей миграцией. Технология оперативного перемещения позволяет переносить на новый сервер операционную систему и его приложения, чтобы балансировать загрузку по доступным аппаратным средствам.

Также виртуализация активно применяется при разработке программного обеспечения. Отказ ядра операционной системы (ОС) или любого из его драйверов (последнее верно для монолитных ядер) приводит к краху всей операционной системы. Виртуализация позволяет одновременно выполнять несколько операционных систем, и, если одна из них терпит крах из-за ошибки, гипервизор и другие операционные системы продолжают работать. Это упрощает отладку ядра до уровня сложности отладки приложений пространства пользователя.

К этой же категории относится использование средств виртуализации для исследования потенциально-опасного программного кода (вирусные и шпионские программы).

Последней областью применения виртуализации является запуск инородного прикладного программного обеспечения. В той или иной степени эмуляция частей операционных систем использовалась довольно давно. Так, для запуска пользовательских приложений Windows 3.1 в операционных системах Apple MacOS и в IBM OS/2 использовалось специальное программное обеспечение, имитировавшее прикладные программные интерфейсы данной оболочки и включавшее значительную часть ее программного кода. Схожую функцию выполняет более современный проект Wine для ОС Linux и *BSD.

Другим примером виртуализации прикладного уровня является технология Rosetta, применяемая в последних версиях Apple MacOS X в связи с переходом с аппаратной платформы PowerPC на платформу Intel. С помощью данной технологии пользователь получает возможность прозрачно запускать на современных компьютерах программное обеспечение, написанное под прежнюю аппаратную платформу. Данный метод несет значительную вычислительную нагрузку. Однако данные издержки более чем оправданы, учитывая обширный парк прикладного программного обеспечения, накопленный для платформы PowerPC и благодаря эмуляции аппаратных средств доступный на современных компьютерах Apple.

Итак, мы определили три категории задач, решаемых в с помощью виртуализации:

- консолидация сервера;

- виртуализация для исследования и отладки;

- виртуализация для переноса программного обеспечения.

Названные задачи в большей или меньшей степени актуальны для смартфона. Наиболее целесообразной представляется все же виртуализация для запуска инородного прикладного программного обеспечения. Само по себе это является наиболее быстрым способом перенести накопленную базу приложений на новую платформу. Однако, если персональная ЭВМ допускает установку нескольких операционных систем с последующей их поочередной загрузкой для решения различных задач, то в случае устройств мобильной связи это невозможно. Типичная операционная система смартфона выполняет также основные функции коммуникаций. Установка на устройство более универсальной ОС приводит к тому, что основное назначение – связь – становится недоступным. Таким образом, использование виртуализации и гостевых ОС является единственным приемлемым способом расширения базы прикладных приложений смартфона за счет быстрого переноса кода из операционных систем общего назначения.

каким образом?

Существуют различные способы реализовать виртуализацию. Наиболее распространенные методы - аппаратная виртуализация, полная виртуализация и паравиртуализация.

Аппаратная эмуляция, самый сложный из методов виртуализации, предполагает, что на основной системе создаётся аппаратная виртуальная машина (ВМ), эмулирующая необходимые аппаратные средства. Главная проблема аппаратной эмуляции - высокие требования к вычислительным ресурсам. Поскольку каждая команда должна моделироваться на используемом оборудовании, происходит замедление выполнения в сотни раз. Если эмулируемое аппаратное обеспечение включают конвейеры центрального процессора и блоки кэширования ветвлений, фактическое уменьшение скорости может быть порядка тысяч раз. Аппаратная эмуляция имеет и преимущества. Например, использование аппаратной эмуляции позволяет выполнить немодифицированную операционную систему, предназначенную для другой аппаратной платформы. Одно из наиболее востребованных применений аппаратной эмуляции - одновременная разработка встроенного программного обеспечения и аппаратных средств.

Модификацией аппаратной эмуляции является метод двоичной трансляции, при которой инструкции эмулируемой аппаратной платформы налету переводятся в команды платформы реальной. Такой подход позволяет несколько увеличить скорость выполнения программ приложений. Наибольшее распространение этот метод получил однако в сфере кроссплатформенных систем программирования, таких как Java и NET, в которых кроссплатформенность достигается тем, что программы транслируются в платформо-независимый байт-код и выполняющихся на виртуальном оборудовании, не соответствующем в действительности ни одной из существующих аппаратных платформ. Трансляция одного участка кода производится один раз за время работы программы, что и обеспечивает прирост в производительности. Хотя использование двоичной трансляции дает преимущества, вместе с тем усложняется работа виртуальной машины и налагаются на нее дополнительные требования.

Полная виртуализация является другим распространенным методом. Эта модель использует монитор виртуальной машины, который является посредником между гостевыми операционными системами и аппаратными средствами. Определенные защищенные инструкции должны быть перехвачены и обработаны гипервизором, который обеспечивает разделение реального оборудования между операционными системами. Полная виртуализация быстрее, чем аппаратная эмуляция, но из-за посредничества гипервизора выполнение программ все-таки замедленно. Огромное преимущество полной виртуализации - отсутствие необходимости модифицировать операционную систему. Единственное ограничение состоит в том, что операционная система должна поддержать используемое оборудование.

Паравиртуализация имеет некоторое сходство с полной виртуализацией. Этот метод использует гипервизор для распределенного доступа к используемому оборудованию, но интегрирует выполняющий виртуализацию код в операционную систему непосредственно. Этот подход устраняет потребность в любой перекомпиляции или перехвате, потому что сами операционные системы сотрудничают в процессе виртуализации.

Недостатком паравиртуализации является то, что при реализации метода необходимо модифицировать гостевые операционные системы. Но
паравиртуализация предлагает скорость выполнения не намного ниже, чем системы без виртуализации. Как и у метода полной виртуализации, возможна поддержка нескольких различных операционных систем одновременно.

Современный смартфон является полнофункциональным широкопрофильным компьютером, возможности которого далеко выходят за пределы изначальной коммуникационной функции, охватывая ведение баз данных, получение и обработку изображений, работу с файловой системой и файлами различных форматов на сменных носителях, выполнение игровых и развлекательных задач. Средства виртуализации могли бы еще более расширить возможности таких устройств.



Рис. 1. Сравнение технологий виртуализации.

На рис. 1 приведен результат выполненного сравнения описанных технологий виртуализации, приведенный к условной пятибалльной шкале. В число сравниваемых характеристик были включены способность ОС и прикладного программного обеспечения противостоять сбоям в работе системы, производительность, потребление памяти и сложность реализации. Смартфон накладывает на них следующие требования:

- способность ОС и прикладного программного обеспечения противостоять сбоям в работе системы – умеренно-высокая (поскольку смартфон обычно не относится ч числу критичных к случайным сбоям устройств, таких как системы жизнеобеспечения, медицинского и технического мониторинга и др.).

- производительность – высокая, учитывая ограниченные ресурсы устройства.

- потребление памяти – низкое, также исходя из ограниченных аппаратных ресурсов.

- сложность реализации – низкая.

Как видно из рис. 1, технология паравиртуализации идеально соответствует выбранным критериям.

Cooperative Linux...

Технология паравиртуализации позволяет с помощью специальной программы-гипервизора, обеспечивающей распределенный доступ к оборудованию, одновременно работать двум операционным системам, каждая из которых при этом может выполнять собственные функции. Реализации метода паравиртуализации требует модифицировать гостевые операционные системы для того, чтобы они могли получить доступ к оборудованию через гипервизор. В отличие от гостевой, базовая операционная система требует только написания специального драйвера, взаимодействующего с гипервизором. Поэтому в настоящий момент проекты паравиртуализации реализованы для операционных систем с открытым исходным кодом.

Проект Cooperative Linux является одной из реализаций данной технологии на архитектуре i386. При использовании Cooperative Linux каждое ядро имеет собственный контекст центрального процессора и адресное пространство, и каждое ядро решает, когда отдать управление ядру-партнеру. Работа Cooperative Linux возможна под любой операционной системой, которая поддерживает загрузку драйверов.

Только одно из двух ядер может управлять физическими аппаратными средствами, а другое обеспечивается виртуальной аппаратной абстракцией. Ведущим может быть любое ядро операционной системы, которое предоставляет возможность работы с драйвером, обеспечивающим режим CPL0 - режим нулевого кольца - и выполнение распределения памяти.

Большинство изменений в патче Cooperative Linux находится в дереве i386 (единственная поддерживаемая архитектура для Cooperative на текущий момент). Другие изменения – по большей части добавления виртуальных драйверов: cobd (блочное устройство), conet (сеть), и cocon (пульт). Большинство изменений в дереве i386 – добавление кода инициализации и установки.

Cooperative Linux использует драйвера устройств для того, чтобы обратиться к привилегированному режиму и использовать примитивы, экспортируемые ядром ведущей ОС. Основная часть драйвера – независимый от ОС код, который связывается с примитивами, зависящими от ОС: распределением страниц памяти, выводом отладочной информации и связью с пространством пользователя. Виртуальная машина (VM) Cooperative Linux связана с ресурсами процесса – с описателем файла в Linux или с дескриптором устройства в Windows.

Вся физическая оперативная память предоставляется ядру при запуске, а некоторое фиксированное количество физических страниц выделяется для Cooperative Linux. Затем средствами трансляции обеспечивается прозрачная работа Cooperative Linux со страницами памяти. Поэтому всю память, которую Cooperative Linux считает физической, следует рассматривать как псевдо-физическую оперативную память (PRAM).

Память распределяется ведущей ОС соответствующей функцией ядра. Выделенные страницы всегда резидентны и не освобождаются, пока VM не будет завершена.

Таблицы страниц создаются для того, чтобы отображать распределенные страницы в виртуальном адресном пространстве ядра VM. Адресное пространство VM сходно с адресным пространством основного ядра – нормальная зона оперативной памяти (RAM) отображена рядом в 0xc0000000.

Адресное пространство VM также имеет собственные специальные фиксированные отображения – сами таблицы страниц отображаются в 0xfef00000, чтобы обеспечить способность транслировать адреса PPRAM в физические адреса при создании элемента таблицы страниц (PTE) для пространства пользователя. Предусмотрена также специальная карта распределения physical-to-PPRAM отображенная в 0xff000000 ускоряет обработку событий, таких как ошибка страницы, требующих трансляции физических адресов в адреса PPRAM.

Cooperative Linux использует только один процесс ведущей ОС, чтобы обеспечить контекст для себя и его процессов. Этот единственный процесс, называемый colinux-демоном, часто вызывает драйвер ядра, чтобы выполнить переключение контекста между ядром ведущей ОС и ядром гостевой ОС Linux. При частых входах (109 раз в секунду) в ведущее ядро, VM в состоянии полностью управлять центральным процессором и MMU, не влияя на ядро ведущей ОС. Для архитектуры Intel 386, чтобы выполнить переключение контекста необходимо изменить значение регистра - указателя таблицы каталога верхней страницы – CR3.

Промежуточное адресное пространство определяется специально созданными таблицами страниц и в гостевом, и в ведущих контекстах и отображает тот же самый код, который используется для переключения (код прохода) в обеих используемых виртуальных адресациях. Когда происходит переключение контекста, сначала изменяется CR3, чтобы указать на промежуточное адресное пространство. Далее, используя безусловный переход, EIP перемещается к другому отображению кода прохода. Наконец, CR3 изменяется так, чтобы он указывал на каталог таблицы верхней страницы другой ОС. Одна страница MMU, которая содержит код страницы прохода, также содержит сохраненное состояние одной ОС, в то время как другая выполняется. В начале переключения контекста запрещены прерывания, и текущее состояние сохраняется в странице прохода кодом страницы прохода.

для Symbian?

При анализе возможностей переноса выбранной схемы виртуализации в качестве базовой рассматривалась ОС Symbain - во-первых, как наиболее знакомая автору среди ОС для смартфонов, а во-вторых — как ОС достаточно экзотичная, чтобы прямое портирование настольных приложений под нее было затруднено.

При анализе возможностей архитектуры ARM, являющейся основой современных устройств на базе Symbain, были выявлены аналогичные рассмотренным выше возможности, заключающиеся в аппаратно-ускоренном быстром переключении контекста процесса – Fast Context Switch Extension (FCSE). FCSE позволяет многим программам, запущенным на процессоре ARM, использовать идентичные диапазоны адресов, гарантируя обеспечение различия предоставляемых адресов для процесса и остальной части системы памяти. FCSE обрабатывает каждый виртуальный адрес при запросе доступа к памяти для предоставления измененного виртуального адреса.

В середине кода страницы прохода восстанавливается состояние другой ОС и разрешаются прерывания. Этот процесс является родственным "нормальному" процессу переключения контекста. Так как управление возвращается ведущей ОС при каждом аппаратном прерывании, то планировщик ведущей ОС отвечает за задание интервалов времени для VM Cooperative Linux (так, как если бы VM была постоянным процессом).

Cooperative Linux должен установить таблицу векторов прерываний, чтобы обрабатывать аппаратные прерывания, которые происходят в системе. Однако Cooperative Linux только пересылает запросы прерываний ведущей ОС.

Внутренние векторы прерывания процессора (0x0-0x1f) и векторы системных вызовов (0x80) содержатся как есть, так что Cooperative Linux обрабатывает собственные ошибки страниц и другие исключения, а остальные вектора прерывания указывают на специальные программы обработки прерывания (ISR).

Когда такая ISR вызывается внешним аппаратным прерыванием в течение контекста Cooperative Linux, выполняется переключение контекста в ведущую ОС, используя код прохода. С другой стороны, адрес этого ISR ведущей ОС определен в таблице дескрипторов прерываний (IDT) ведущей ОС. Стек вызова по прерыванию подменяется, и происходит переход по адресу ISR. Между запросом ISR на стороне Linux и обработкой прерывания на стороне ведущей ОС заблокирован флаг прерывания. Эти манипуляции добавляют небольшое время запаздывания обработки прерываний в ведущей ОС, но им можно пренебречь. Беря во внимание тот факт, что эта методика отсылки прерываний также связывает аппаратное прерывание по таймеру, ведущая ОС не может обнаружить, что его CR3 был подменен на небольшое время, и поэтому в результате переключения контекста не происходит никаких исключений на ведущей стороне. Чтобы обеспечить прерывания для виртуальных драйверов устройств гостевой ОС, производят изменения в коде архитектуры; добавляют виртуальный контроллер прерываний, который получает сообщения от ведущей ОС по случаю переключения и вызывает do_IRQ() с подменённой структурой pt_args. Номера прерываний виртуальны и распределены в зависимости от устройства.

Гипервизор и загрузчик Cooperative Linux выполняется базовой ОС в качестве специализированного драйвера / расширения ядра. В случае ОС Symbian код драйвера разделяется на две относительно независимые составляющие, которые в свою очередь могут состоять из двух компонент – интерфейса с аппаратной частью / ядром и API.

Модель драйвера устройства ОС Symbian использует два типа DLL ядра – логический драйвер устройства (LDD) и физический драйвер устройства (PDD). Это соглашение обеспечивает уровень абстракции, который помогает в переносе программного обеспечения между платформами и в добавлении новых возможностей драйверов устройств без изменения общего кода и API.

LDD обычно разрабатывается для выполнения общих функциональных возможностей, а PDD используют для того, чтобы реализовать код, зависимый от устройства.

Symbian обеспечивает стандартные LDD для периферийных устройств (драйвера медиа-устройств, контроллер USB и последовательные устройства связи). Однако изготовители телефонов часто разрабатывают собственные интерфейсы для специальных аппаратных средств, что требует разработки дополнительных LDD.

PDD управляет конкретным периферийным устройством от имени его LDD и содержит код, зависимый от устройства. PDD взаимодействует только с соответствующим ему LDD, таким образом приложение пользовательской стороны не может получить доступ непосредственно к PDD. На PDD возлагают обязанности взаимодействия с вариантными (the variant) и простыми расширениями (extensions) или непосредственно аппаратными средствами. Как и LDD, PDD может быть сконфигурирован для выполнения инициализации во время загрузки.

К тому времени, когда ядро готово запустить планировщик, оно требует ресурсов, которые строго не определены архитектурой центрального процессора, которые обеспечиваются расширениями. Эти расширения являются специфичными для конкретной платформы, на которой запускается ОС Symbian, и разрешаются для портирования изготовителем телефона, без непосредственной перекомпиляции ядра ОС.

Расширение состоит из двух компонентов: слой, независимый от платформы (PIL), и слой, определяемый платформой (PSL). Перечисленные слои аналогичны слоям LDD/PDD у драйверов устройств. PIL в основном отвечает за обеспечение функциональных возможностей, одинаковых у версий расширения, и определяет API с PSL, который обеспечивает связь непосредственно с аппаратными средствами.



Калиновский Р. В.
обсудить статью
© сетевые решения
.
.