Виртуализация исполнения машинного кода процессорной архитектуры ARM в Android-x86 окружении (1187396)
Текст из файла
Министерство образования и науки Российской ФедерацииМОСКОВСКИЙ ФИЗИКО-ТЕХНИЧЕСКИЙ ИНСТИТУТ(государственный университет)ФАКУЛЬТЕТ УПРАВЛЕНИЯ И ПРИКЛАДНОЙ МАТЕМАТИКИКАФЕДРА ИНФОРМАТИКИВиртуализация исполнения машинного кодапроцессорной архитектуры ARM в Android-x86окруженииВыпускная квалификационная работастудента 176 группыЛещёва Даниила СергеевичаНаучный руководительТормасов А.Г., д. ф.-м. н., профессорг. Долгопрудный20171Содержание1. Введение32.Технологии виртуализации52.1 Существующие технологии виртуализации62.2 Устройство QEMU73. Постановка задач114. Возможные подходы виртуализации134.1 Структура эмулятора134.2 User-mode эмуляция184.3 Загрузчик195.
Оптимизация эмуляции266. Оценка быстродействия эмуляции297. Бинарная трансляция337.1 Декомпозиция задачи бинарной трансляции397.2 Модуль code-flow анализа архитектуры ARM447.3 Анализ использования регистров и регистровый аллокатор487.4 Модуль бинарной трансляции507.5 Модуль связывания блоков578.
Оценки производительности619. Заключение6510. Список используемой литературы6721. ВведениеДанная работа является исследованием, относящимся к областивиртуализации, а также архитектурам двух семейств процессоров (ARM иx86). В данной работе рассматривается проблема выполнения машинногокода, скомпилированного под архитектуру ARM на процессорах семействаx86, а также возможное решение с помощью технологии виртуализации.В настоящее время виртуализация становится всё более и болеепопулярнойтехнологией,применяемойкакорганизациями,такиотдельными пользователями.
По своей сути виртуализация являетсяпредоставлениемдополнительногоабстрактногоуровнямеждупользовательскими программами (как ОС, так и приложениями) иаппаратнымиструктурами,накоторыхданныепрограммыбудутвыполняться.Существует огромное множество видов виртуализации, необходимовыделить те их них, которые позволяют исполнять машинный код наархитектуре, чужеродной по отношению к нему (ARM → x86). Их подробноеописание будет дано в разделе ниже, а пока стоит сказать, что в качествеотправной точки была взята эмуляция.Для того, чтобы исследование являлось актуальным, было решено вкачестве прикладной части работы использовать реальную проблему,возникающую перед разработчиками ПО.
Таковой была выбрана проблемапереноса Android приложений, использующих нативный код, с ARMархитектуры на x86 без пересборки. Необходимо сказать, что в данныймомент Android является одной из наиболее популярных мобильных ОС, что3влечёт за собой наличие большого числа разработчиков, выпускающихприложения под эту платформу.Основным языком разработки под Android является Java. Это позволяетразработчикам не задумываться о кроссплатформенности, так как Java-кодисполняется так называемой Java-машиной. До недавнего времени наплатформе Android использовался Dalvik, но с приходом версии 5.0 егозаменил ART.
В то же время Java позволяет использовать при написанииприложений нативные языки, в первую очередь C/C++ через JNI(Java NativeInterface)[1].На данный момент основная масса (>90%) Android-устройств работаютна процессорах архитектуры ARM, однако появляются производители, такиекак Lenovo, предоставляющие модели, работающие на процессорахархитектуры x86 [2].Возникает проблема с проблема с приложениями, использующиминативный машинный код в своем составе, но более не поддерживаемыеразработчиками. В большинстве своём это ресурсоемкие приложения,использующие, как правило, трехмерную графику – игры, CAD-пакеты ипрограммыдляработысвидео.Таккаконинеявляютсякроссплатформенными в отличие от чистых Java-приложений – ихневозможно использовать на устройстве с чужеродной архитектуройпроцессора.Однако данное ограничение можно обойти, если добавить слойвиртуализации, который позволит выполнять машинный код ARM насемействе процессоров x86 без пересборки приложения. Это также позволит4выполнятьотладкуприложений,использующихнативныйкоднепосредственно на рабочей станции разработчика, без необходимости вфизическом устройстве для отладки.2.
Технологии виртуализацииКак уже было сказано выше, в данной работе наибольший интереспредставляют те технологии виртуализации, которые позволяют исполнятьмашинный код ARM на x86, то есть способные предоставлять возможностьиспользовать аппаратную платформу, не связанную архитектурно или каклибо ещё с реальным железом, на котором происходит виртуализация. Внастоящее время эта тема активно развивается посредством усилийразличных компаний из сферы информационных технологий, также написанобольшое количество литературы, посвященной данному вопросу [3,4,5].2.1 Существующие технологии виртуализацииВ настоящее время среди подобных систем можно выделить три наиболеераспространенных технологии [6]:2.1.1. ЭмуляцияЗаключается в полном или частичном представлении необходимыхаппаратныхкомпонентов(процессор,память,устройства)ввидевиртуальных объектов. Для исполнения машинного кода в таком окружениитребуется пошаговый разбор и эмуляция инструкций на виртуальномпроцессоре.Из плюсов подобного подхода можно выделить независимость отаппаратной начинки хостовой системы, а также широкий простор длякастомизации.
К сожалению у такого подхода есть один существенный5минус – эмуляция крайне малопроизводительна, падение быстродействияобычно достигает нескольких порядков.На сегодняшний день такой подход использует QEMU для целого рядапроцессорных архитектур, которые не являются широко распространеннымиили же имеют сложную для трансляции структуру машинного кода.2.1.2. Статическая бинарная трансляцияПодразумевает однократную полную трансляцию гостевого машинногокода в машинный код хостовой системы. Основной проблемой данногоподхода является его сложность, так как без запуска программы невозможно,к примеру, заранее узнать наиболее часто используемые блоки инструкций,для того чтобы провести оптимизации.Основнымпреимуществомтакогоподходаявляетсяскоростьполученного кода, так как после трансляции весь код исполняется нареальной аппаратуры.
К недостаткам можно отнести практическуюсложность реализации.В настоящий момент такой подход использует ART, однако в его случаепроисходить трансляция Java байт-кода в машинные инструкции.2.1.3. Динамическая бинарная трансляцияДанный подход подразумевает трансляцию гостевого машинного кода вмашинный код хостовой платформы на лету, во время исполнения. Для этогокак правило используется эмулятор, который после единичного прохода поблоку машинных инструкций гостевого кода транслирует его в блокмашинныхинструкцийхостовойсистемы,которыйвпоследствииисполняется нативно.Достоинством данного метода является быстродействие, которое6достигается за счёт того, что все или почти все инструкции гостевого кода вконечном счёте исполняются нативно. Также динамический подходпозволяет собирать статистику исполняемого кода , выделять наиболее частоиспользуемые участки кода для оптимизации, находить неиспользуемый код.Вданноевремятакимподходомпользуетсяотечественныймикропроцессор «Эльбрус», предоставляющий таким образом полнуюсовместимость с платформой x86.
Также такой подход для отдельныхучастков кода использует QEMU.2.2 Устройство QEMUВ данный момент QEMU является относительно быстрым машиннымэмулятором, который использует оригинальный динамический транслятор.Он может эмулировать различные архитектуры процессоров (x86, PowerPC,ARM, Sparc), а также является кроссплатформенным. На данный моментQEMU поддерживает полную эмуляцию системы, что позволяет запускатьоперационную систему без модификаций на виртуальной машине. Такжеподдерживается так называемый user-mode в Linux окружении, когда процессисполняемогофайла,скомпилированногопододнупроцессорнуюархитектуру может быть запущен на другой.Далее рассмотри подробно реализацию динамического транслятора,который использует QEMU [7]. Данный динамический транслятор позволяетосуществлять преобразование между гостевыми и хостовыми наборамимашинных инструкций непосредственно во время исполнения программы.Далее полученный бинарный код хранится в кэше и может быть использованснова.
По сравнения с интерпретированием такой подход позволяет7осуществлять выборку и декодирование лишь однажды, а не при каждомпроходе по блоку исходного двоичного кода [19,20].Обычно динамические трансляторы сложно переносить с однойпроцессорной архитектуры на другую, так как генератор кода должен бытьполностью переписан при изменении набора машинных инструкций. Длятого, чтобы избежать этого QEMU использует в качестве кодогенераторакомпиляторС,которыйпредставлендлямножествапроцессорныхархитектур. QEMU таким образом остается лишь собирать полученные блокимашинных инструкций воедино.В первую очередь динамический транслятор в QEMU разделяет каждуюпроцессорную инструкцию на некоторое количество более простыхинструкций, так называемых микроопераций.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.