Поддержка системы команд THUMB в двоичной трансляции (1187412), страница 2
Текст из файла (страница 2)
Сравнение псевдокода для аналогов инструкции Add with Carry(ADC) между arm и Thumbif ConditionPassed() thenif Rd == '1111' && S == '1' then SUBS PC, LR;d = UInt(Rd);n = UInt(Rn);m = UInt(Rm);setflags = (S == '1');(shift_t, shift_n) = DecodeImmShift(type, imm5);shifted = Shift(R[m], shift_t, shift_n, APSR.C);(result, carry, overflow) = AddWithCarry(R[n], shifted, APSR.C);if d == 15 then// Can only occur for ARM encodingALUWritePC(result); // setflags is always FALSE hereelseR[d] = result;if setflags thenAPSR.N = result<31>;APSR.Z = IsZeroBit(result);APSR.C = carry;APSR.V = overflow;Иллюстрация 2.
Сравнение кодировки операции между Thumb (сверху) иarm(снизу).[12]В отличии от arm, где для арифметико-логических операций обновлениефлагов состояния кодируется при помощи специального бита в инструкции, дляарифметических операций Thumb выставление флагов является поведениемпо-умолчанию.Исключением является их исполнение в блоке условного выполнения If Then,и инструкции прямого сравнения CMP.Еще одним важным отличием от основного набора инструкций являетсяотсутствие сдвигов, встроенных в опкод инструкции.В оригинальной системе команд arm, второй операнд может быть подвергнутарифметическому либо логическому сдвигу без использования дополнительныхинструкций.
Это позволяет расширить количество представлений длянепосредственных значений, которое ограничено. Очевидно, что командазанимающая целое машинное слово не может включать в себя непосредственноезначение объемом тоже в целое машинное и слово, и при этом иметь смысл.Для обхода этого ограничения в Thumb введены специальные инструкцииLSL, LSR, и т.д.Disassembly of section .text:00000240 <foo>:240: b580242: b082244: af00246: 2300248: 607b24a: 687b24c: 330124e: 607b250: 46c0252: 46bd254: b002256: bd80push {r7, lr}sub sp, #8add r7, sp, #0movs r3, #0str r3, [r7, #4]ldr r3, [r7, #4]adds r3, #1str r3, [r7, #4]nop; (mov r8, r8)mov sp, r7add sp, #8pop {r7, pc}00000258 <__real_main>:258: b580push {r7, lr}25a: b082sub sp, #825c: af00add r7, sp, #025e: f7ff ffefbl 240 <foo>262: 2300movs r3, #0264: 607bstr r3, [r7, #4]266: 687bldr r3, [r7, #4]268: 3301adds r3, #126a: 607bstr r3, [r7, #4]26c: 2300movs r3, #026e: 0018movs r0, r3270: 46bdmov sp, r7272: b002add sp, #8274: bd80pop {r7, pc}...00000278 <main>:278: e59fc004ldr27c: e08cc00fadd280: e12fff1cbx284: ffffffd5.wordip, [pc, #4] ; 284 <main+0xc>ip, ip, pcip0xffffffd5Листинг 2.
Пример дизассемблированного машинного кода, собранного gccдля машины, поддерживающей первую версию Thumb.Disassembly of section .text:00000240 <foo>:240: e52db004244: e28db000248: e24dd00c24c: e3a03000250: e50b3008254: e51b3008258: e283300125c: e50b3008260: e1a00000264: e28bd000268: e49db00426c: e12fff1epush {fp}; (str fp, [sp, #-4]!)add fp, sp, #0sub sp, sp, #12mov r3, #0str r3, [fp, #-8]ldr r3, [fp, #-8]add r3, r3, #1str r3, [fp, #-8]nop; (mov r0, r0)add sp, fp, #0pop {fp}; (ldr fp, [sp], #4)bx lr00000270 <main>:270: e92d4800push {fp, lr}274: e28db004add fp, sp, #4278: e24dd008sub sp, sp, #827c: ebffffefbl 240 <foo>280: e3a03000mov r3, #0284: e50b3008str r3, [fp, #-8]288: e51b3008ldr r3, [fp, #-8]28c: e2833001add r3, r3, #1290: e50b3008str r3, [fp, #-8]294: e3a03000mov r3, #0298: e1a00003mov r0, r329c: e24bd004sub sp, fp, #42a0: e8bd8800pop {fp, pc}Листинг 3.
Тот же код, выраженный в armСокращенный размер инструкции обеспечивает меньше места на кодированиеоперандов. Даже отказ от трех-регистровой схемы “регистр назначения”:”регистрпервого операнда”:”регистр второго операнда”, применяемой в оригинальнойсистеме команд, не позволяет всем командам Thumb адресовать все регистрыпроцессора.Потому для этой системы команд, регистровый файл разбили на две части,верхнюю: регистры с восьмого по шестнадцатый (Hi), и нижнюю: с нулевого поседьмой (Lo).В отличии от x86, где компилятору доступны всего восемь целочисленныхрегистров общего назначения, с большим списком оговорок и конвенциальныхиспользований для половины из них[9], в ARM регистровый файл состоит изпятнадцати регистров общего назначения, плюс двух специализированныхрегистров.
Банк регистров так же различен для разных режимов.Иллюстрация 3, банк регистров архитектуры ARM [12]Программный счетчик и регистр флагов являются единственнымиспециальными регистрами; все остальные подчиняются общим правилам.Исторически сложилось использование тринадцатого регистра для храненияуказателя стека (Stack Pointer, SP), а четырнадцатого для хранения адреса возвратапри вызове процедур (Link Register, LR).Для инструкций arm это не более чем конвенция. Компилятор илипрограммист могут использовать их по своему усмотрению.Однако для первой версии набора команд Thumb это не так. В большинствесвоем, этим инструкциям доступны для адресации только нижние регистры, атринадцатый адресуется особым образом и всегда используется только дляхранения указателя стека.Вторая версия расширений Thumb, помимо инструкции условного исполненияIT, добавила множество инструкций размером в машинное слово.Эти дополнения сделали из набора команд Thumb полноценную архитектурукоманд, позволив закодировать ей весь исполняемый файл целиком, безпроцедур-оболочек на arm.
(см. Листинг 2 и Листинг 3)Они по прежнему не допускают условного исполнения, зашифрованногопрямо в инструкции. Для этого используется IT.Помимо множества сервисных инструкций, вторая версия Thumb включает всебя расширенные до слова арифметическо-логические инструкции.
Они, как иarm-версии, позволяют использовать сдвиги закодированные прямо в инструкции,а также, для непосредственных значений, могут шифровать их используя паттернычасто используемых значений, расширяя один байт до целого слова.Disassembly of section .text:00000240 <foo>:240: b480242: b083244: af00246: 2300248: 607b24a: 687b24c: f103 13ff250: 607b252: bf00254: 370c256: 46bd258: bc8025a: 4770push {r7}sub sp, #12add r7, sp, #0movs r3, #0str r3, [r7, #4]ldr r3, [r7, #4]add.w r3, r3, #16711935str r3, [r7, #4]nopadds r7, #12mov sp, r7pop {r7}bx lr; 0xff00ff0000025c <main>:25c: b580push {r7, lr}25e: b082sub sp, #8260: af00add r7, sp, #0262: f7ff ffedbl 240 <foo>266: 2300movs r3, #0268: 607bstr r3, [r7, #4]26a: 687bldr r3, [r7, #4]26c: 3301adds r3, #126e: 607bstr r3, [r7, #4]270: 2300movs r3, #0272: 4618mov r0, r3274: 3708adds r7, #8276: 46bdmov sp, r7278: bd80pop {r7, pc}Листинг 4.
Дизассемблер примитивной программы, закодированной gcc подthumb-2.Главным же дополнением второй версии расширения Thumb сталавозможность одновременной работы инструкций размером в слово и полуслововнутри одной процедуры, с одновременным расширением списка инструкций,которые поддерживают переход, переключающий режим процессора между двумяархитектурами системы команд.3. Транслятор3.1 Теоретическое основаниеЗа основание, на которое опирается данная работа, является теорема овиртуализируемости и последующие работы.
Архитектура Parallels ARM Emulatorпредставляет собой эмулирующий монитор виртуальной машины с поддержкойстатической (на текущий момент) двоичной трансляции для прикладного уровня.Иллюстрация 4. Монитор виртуальной машиныДанная схема была выбрана из-за невозможности классическойвиртуализации архитектуры ARM на целевой архитектуре x86.Классическая виртуализация (trap & emulate схема) предусматриваетвыполнение эмулируемого и реального кода в в одном и том же пространствепамяти, на одном и том же реальном устройстве, с сохранением контекстаэмулируемой системы в заранее определенном участке памяти.При этом обращения эмулируемого кода к участкам памяти реальнойсистемы, смены привилегий и обращения к устройствам обрабатываютсямонитором отдельно (trap).Для такой схемы была разработана модель, используя которую возможнодоказательство возможности построения эффективного монитора виртуальноймашины для заданной архитектуры.
[11]Такой монитор обладает тремя важнейшими характеристиками. Первое, онпредоставляет среду выполнения, не отличимую от настоящего аппаратногообеспечения.Второе, замедление исполнения программ в контролируемой монитором средеисполнения должно быть минимальным и идеально различия должны быть недетектируемы изнутри среды.Третье, монитор должен обладать абсолютным контролем над ресурсамипредоставляемым виртуальной среде.Существуют дополнения данной схемы, которые расширяют теоретическийбазис на более современные модели архитектур и также рассматриваютвозможность кроссплатформенной виртуализации (с отличающимисяэмулируемыми и реальными архитектурами).
[16]Однако в данном случае классическая виртуализация попросту невозможна,что доказывается в работе Нилса Пеннмана и прочих. [15] Основной причиной дляэтого является наличие в системах команд таких инструкций, как SVC, SEV, WFEи других, которые являются чувствительными инструкциями, доступнымпользователю, что нарушает условия теоремы о виртуализируемости.Виртуальной машиной называется среда исполнения, создаваемая мониторомвиртуальных машин.
В нашем случае пользовательские приложения видят средуисполнения как машину с процессором generic ARM архитектуры иконфигурируемым набором остальной аппаратуры, чье пользовательскоеокружение (набор библиотек и операционная система) полностью повторяетданное у реальной системы, на которой запущен эмулятор. [11]Состояние виртуальной машины в любой момент времени описываетсячетверкойS = {E, M , P , R} , S ∈ CГде E это линейная область исполняемой памяти, M это контекст процессора(состоящий как минимум из двух режимов: привилегированного ипользовательского), P программный счетчик, и R - схема адресации в E.Множество C - конечное множество состояний.Инструкцией классическая теория виртуальных машин называет отображениеi : C → C .
Инструкции могут быть перехвачены процессором в случаенедопустимости с точки зрения уровня привилегий, или доступа к неправильномуили запрещенному участку памяти. При перехвате, управление передается взаранее определенный обработчик в памяти, а состояние системы сохраняется длявосстановления после обработки.Все инструкции в заданной система набора команд делятся на три класса.Первый - привилегированные инструкции, которые выполняются корректно впривилегированном (заданном множестве таковых) режиме, и перехватываются вовсех остальных.Второй - чувствительные инструкции, класс состоящий изконтроль-чувствительных и поведение-чувственных инструкций.Контроль-чувственные инструкции пытаются изменить режим исполнения, вкотором находится система, либо количество доступной памяти.Поведение-чувственные могут иметь различный результат выполнения, взависимости от их положения в памяти, либо от режима исполнения, в которомнаходится система.Третий класс состоит из всех остальных инструкций.Как было сказано выше, обе системы команд в архитектуре ARM содержатинструкции, которые являются чувствительными, но не являютсяпривилегированными.