Jazelle

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Jazelle DBX (англ. Direct Bytecode eXecution, «безпосереднє виконання байткоду») — технологія, що дозволяє виконання інструкцій байт-коду Java на апаратному рівні. Реалізована у деяких процесорах архітектури ARM.[1]

Пропрієтарні віртуальні машини Java, що підтримують Jazelle, виконують код Java апаратно, і лише для деяких складних чи рідко використовуваних інструкцій — програмно. Згідно з вимогою ARM, приблизно 95 % байт-коду типового програмного забезпечення виконувалися апаратно.[джерело?]

Перша архітектура з підтримкою Jazelle — ARMv5TEJ[2], а перший дизайн процесора з цією технологією — ARM926EJ-S[3]. Наявність Jazelle позначається літерою «J» у назві архітектури чи процесора.

Опублікувані специфікації є досить неповними, оскільки достатні лише для написання коду операційної системи яка може підтримувати JVM, використовуючи Jazelle. Проголошена мета полягає в тому, що тільки JVM повинно (або може) залежати від деталей апаратного інтерфейсу. Цей тісний зв'язок між JVM і апаратною складовою сприяє їх взаємному розвитку без шкоди для інших програм. По суті це надає ARM Ltd. значний контроль над тим, які саме Java-машинами здатні використовувати Jazelle.

Одне з очевидних застосувань Jazelle — прискорення виконання програм для платформи Java ME.

Технологія ThumbEE, що з'явилася у архітектурі ARMv7, може вважатися номінальним нащадком Jazelle.

Реалізація[ред. | ред. код]

Розширення Jazelle працює як двійковий транслятор, і реалізоване як додаткова стадія між вибіркою і декодуванням інструкції центрального процесора. Розпізнані байт-коди перетворюються в послідовності з однієї або більше інструкцій ARM.

Режим Jazelle виконує апаратно найбільш поширені прості інструкції JVM, з метою суттєво збільшити швидкість інтерпретації. Серед іншого, це зменшує необхідність в компілюванні «на льоту» (just in time) та інших JVM технологій прискорення[4]. JVM інструкції, які не реалізовані на апаратному рівні Jazelle, призводять до виклику відповідних підпрограм у JVM. Детальна інформація не публікується.

Перехід до режиму Jazelle здійснюється інструкцією BXJ.

Архітектура системи команд[ред. | ред. код]

Набір команд Jazelle документовано як байт-код Java. Разом з тим компанією ARM не було опубліковано подробиць з виконання цих команд. Наприклад, у документації, що надається з віртуальною машиною HotSpot, вказано: «Для того, щоб уникнути непорозумінь, заявляємо: дистрибуція програм, які містять код інструкції BXJ і дозволяють використовувати режим Jazelle [..] без явного дозволу компанії ARM заборонена.»[5].

Співробітники ARM в минулому опублікували декілька «білих» документів (англ. white papers), що мали показати деякі аспекти розширень процесора. Довідник з архітектури ARM версії 2008 року містив псевдокод інструкції BXJ (англ. Branch and eXchange to Java), але без вказання подробиць.

Двійковий програмний інтерфейс (ABI)[ред. | ред. код]

Двійковий програмний інтерфейс (ABI) Jazelle, необхідний для коректної взаємодії з JVM, не опублікований ARM, в результаті чого Jazelle є незадокументованою функцією для більшості користувачів і відкритих реалізацій JVM.

Стан віртуальної машини Jazelle знаходиться в межах звичайних регістрів ARM, що забезпечує сумісність з існуючими операційними системами і обробниками переривань і винятків. Перезапуск байт-коду (наприклад, після повернення з переривання) повторно виконує всю послідовність відповідних інструкцій ARM.

Найважливіші складові стану JVM зберігаються у спеціальних регістрах: регістри r0-r3 слугують як аліас вершини стеку Java, регістр r4 містить локальний операнд номер 0 (призначений для *this), а r6 вказує на верхівку стеку Java.[6]

Jazelle використовує той самий регістр адреси інструкції, що і решта режимів ARM (r15)[7]. Регістр r14 вказує на наступний байт-код в r14[8], тому лічильник команд у Jazelle-режимі, як правило, не помітний для користувача (якщо тільки не відбувається зневадження).

Індикація режиму у регістрі CPSR[ред. | ред. код]

Режим виконання байт-коду Java позначається поєднанням двох бітів у регістрі ARM CPSR (англ. Current Program Status Register — регістр поточного статусу програми). Біт T має бути очищений, а біт J — встановлений.[9]

Байт-код декодується апаратно в два етапи (у порівнянні з одним для Thumb та ARM коду). Перемикання між апаратним та програмним декодуванням (режим Jazelle і режим ARM) займає приблизно 4 такти процесора.[10].

Для входу у режим Jazelle, біт JE (англ. Jazelle Enable)[2] у регістрі співпроцесора CP14:c0(c2) (біт 0) повинен бути встановленим. Якщо операційна система очищує цей біт, це унеможливлює виконання програми користувача з прискоренням Jazelle[11]. Крім цього, біт 1 (CV, англ. Configuration Valid) регістру CP14:c0(c1)[2][11] має бути встановлений, щоб показати, що встановлена конзистентність режиму Jazelle для використання процесором.

Інструкція BXJ[ред. | ред. код]

Інструкція BXJ (англ. Branch and eXchange to Java)) здійснює перехід на вказану адресу, і одночасно, якщо це можливо, встановлює стан Jazelle — біт J у регістрі CPSR. Якщо вхід у режим Jazelle неможливий, інструкція діє аналогічно до BX.[2] Єдине місце, де операційна система або зневаджувач повинні знати про режим Jazelle, це декодування інструкцій, що викликають виняткові ситуації. Перед виконанням команди BXJ до регістру R14 (Link Register) повинна бути записана адреса наступної інструкції у режимі Java, незалежно від того, використовується апаратне прискорення Java чи ні.

Через те, що поточний стан процесора зберігається у CPSR, набір команд Java автоматично активується після перемикання задачі, і виконання Java продовжується з коректної адреси.

Після переходу в режим Jazelle, байт-код може опрацьовуватися по одному з трьох шляхів; декодування і виконання на апаратному рівні, програмне виконання (з оптимізованим для ARM/ThumbEE кодом JVM), або некоректний код операції. Третій випадок спричиняє виняткову ситуацію (режим ARM) — наприклад, так відбувається у випадку Java байт-коду 0xFF, що використовується для встановлення точки зупинки JVM (breakpoint)[12].

Виконання продовжується на апаратному рівні до тих пір, поки не трапиться непідтримуваний байт-код, або не виникне нештатна ситуація. З 203 кодів, зазначених у специфікації JVM, апаратно декодуються і виконуються приблизно 134—149 інструкцій.

Низькорівневі регістри[ред. | ред. код]

Низькорівневі регістри конфігурації апаратної віртуальної машини знаходяться в ARM співпроцесорі «CP14 регістр c0». Регістри дозволяють виявляти, вмикати або вимикати апаратний прискорювач, якщо він присутній.[13]

  • Jazelle Identity Register (CP14:c0(c0)): доступний тільки для читання у всіх режимах.
  • Jazelle OS Control Register (CP14:c0(c1)): доступний лише у режимі ядра, при зверненні з режима користувача настає виняткова ситуація.
  • Jazelle Main Configuration Register (CP14:c0(С2)) доступний лише для запису в режимі користувача та читання-запису в режимі ядра.

Емулятор QEMU підтримує «тривіальну» реалізацію Jazelle: інструкція BXJ працює так само, як і звичайна BX, а всі регістри CP14:c0 повертають при читанні нуль.[2][14]

Джерела[ред. | ред. код]