Jazelle

A Jazelle DBX (angolul: Direct Bytecode eXecution, közvetlen bájtkód­végrehajtás) egy kiterjesztés, ami lehetővé teszi néhány ARM processzor számára a Java bájtkód közvetlenül a hardverben történő végrehajtását, harmadik végrehajtási állapotként, a meglévő ARM és Thumb módok mellett. A Jazelle funkcionalitás az ARMv5TEJ architektúrában volt specifikálva. Az első ilyen technológiával ellátott processzor az ARM926EJ-S volt. A Jazelle-t a CPU nevéhez fűzött „J” jelöli, a v5 utáni magok kivételével, melyekben ez a végrehajtási mód, csak triviális formában ugyan, de szükséges az architektúrának való megfeleléshez.

A Jazelle RCT (Runtime Compilation Target, futásidejű fordítási cél) egy másik, a ThumbEE módon alapuló technológia, ami támogatja az ahead-of-time (AOT) és just-in-time (JIT) fordítási technikákat a Java és más nyelvek végrehajtási környezeteiben.

A Jazelle DBX legjelentősebb felhasználási módja a mobiltelefon-gyártók körében volt, a Java ME játékok és alkalmazások végrehajtási sebességének növelésére. A Jazelle-kompatibilis Java virtuális gép (JVM) a hardverben próbálja futtatni a Java bájtkódot, miközben visszatér a szoftverhez a komplikáltabb vagy kevésbé használt bájtkód-műveleteknél. Az ARM azt állítja, hogy a tipikus programhasználat során a bájtkód körülbelül 95%-a közvetlenül a hardverben kerül feldolgozásra.

A publikált specifikáció nagyon hiányos, csak olyan operációs rendszer kód írásához elég, amely a Jazelle-t használó JVM támogatásához szükséges. A deklarált szándék az volt, hogy csak a JVM szoftvernek kell (vagy szabad) függenie a hardver interfész részleteitől. Ez a szoros kötés elősegítette volna a hardver és a JVM együttes fejlődését anélkül, hogy más szoftverekre hatással lenne. Valójában ez jelentős kontrollt biztosított az Arm Holdings számára afelett, hogy mely JVM-ek használhatják a Jazelle-t. Ez sikeresen megakadályozta a technológia nyílt forráskódú JVM-ekben való használatát is. Ezek a problémák nem állnak fenn az ARMv7 ThumbEE környezetnél, ami a Jazelle DBX névleges utódja.

A Jazelle technológia viszonylag rövid életű volt az ARM processzorok körében. A gyakorlati megvalósítások során kiderült, hogy a Jazelle-lel ellátott processzorok alig valamivel gyorsabbak, mint a szoftveres JVM-ek, és a későbbi, fejlettebb JIT fordítók sokkal jobb teljesítményt nyújtottak, mint a Jazelle hardveres megoldása. A technológia ARM platformra korlátozódott, a dokumentáció hiánya és a felhasználás korlátozása miatt nem terjedt el, és később támogatása teljesen meg is szűnt. Külön korlátozó tényező, hogy a Java bájtkód specifikációja is változott, aminek hardveres úton történő követése nagyon költséges lenne.

Megvalósítás

A Jazelle kiterjesztés alacsony szintű bináris fordítást használ, extra szakaszként megvalósítva a lehívási és dekódolási fokozatok között a processzor utasítás-futószalagjában. A felismert bájtkódokat az utasításfeldolgozó egy vagy több natív ARM utasításból álló sorozattá alakítja át.

A Jazelle mód a JVM kódértelmezését a hardverbe helyezi át, a leggyakoribb egyszerű JVM utasítások esetén. Ennek célja, hogy jelentősen csökkentse a kódértelmezés (interpretáció) költségeit. Ez csökkenti a futásidejű fordítás és más JVM-gyorsító technikák szükségességét. A Jazelle nem minden bájtkód-utasítást kezel a hardverben, a hardverben nem implementált JVM utasításokat maga a Jazelle-kompatibilis JVM implementáció hajtja végre, szoftveres rutinok segítségével. A részleteket nem publikálták, mivel a JVM minden belső része átlátható, a megfelelő visszafejtés segítségével.

A Jazelle módba a BXJ utasításokkal lehet belépni. A Jazelle hardveres implementációja csak a JVM bájtkódok egy részét fedi le, a kezeletlen bájtkódok esetén – vagy ha az operációs rendszer felülbírálja – a hardver meghívja a szoftveres JVM-et. A rendszert úgy tervezték, hogy a szoftveres JVM-nek nem kell tudnia, hogy mely bájtkódok vannak hardveresen megvalósítva és a szoftveres JVM szoftveres végrehajtási alternatívát biztosít a teljes bájtkódkészlethez.

Utasításkészlet

A Jazelle utasításkészlet Java bájtkódként jól dokumentált. Ugyanakkor az ARM nem hozta nyilvánosságra a pontos végrehajtási környezet részleteit; a Sun HotSpot Java virtuális géphez mellékelt dokumentáció például egyenesen kijelenti: „A félreértések elkerülése végett, a BXJ utasítás használatához szükséges szoftverkódot tartalmazó és az ARM Jazelle architektúra-kiterjesztés használatát lehetővé tevő termékek terjesztése ... az ARM hozzájárulása nélkül kifejezetten tilos.”

ARM alkalmazottak a múltban számos tanulmányt publikáltak, amelyek jó támpontokat adnak a processzorkiterjesztéssel kapcsolatban. Az ARM architektúrareferencia kézikönyv 2008-től elérhető változatai tartalmaznak pszeudokódot a BXJ (Branch and eXchange to Java, „elágazás és váltás Javába”) utasításhoz, de az aprólékosabb részletek mellett a "SUB-ARCHITECTURE DEFINED" jelzés áll és azok máshol vannak dokumentálva.

Application binary interface (ABI)

A Jazelle állapot egy a JVM és a Jazelle hardverállapot közötti egyeztetett hívási konvencióra támaszkodik. Ezt a alkalmazási bináris interfészt (application binary interface, ABI) az ARM nem publikálta, miáltal a Jazelle teljesen dokumentálatlan lehetőséggé vált a legtöbb felhasználó és szabad szoftveres JVM számára.

A teljes VM állapot normál ARM regiszterekben tárolódik, ami megőrzi a kompatibilitást a meglévő operációs rendszerekkel és megszakításkezelőkkel, változatlan módon. Egy bájtkód ismételt végrehajtása (mint például egy megszakításból való visszatérés után) újra végrehajtja a kapcsolódó ARM utasítások teljes sorozatát.

Egyes regiszterek speciálisan a JVM állapot legfontosabb részeinek tárolására szolgálnak: az R0–R3 regiszterek a Java verem tetejének aliasát, az R4 a Java nulladik lokális operandusát (a *this mutatóját), az R6 pedig a Java veremmutatót tartalmazza.

A Jazelle újrafelhasználja a meglévő programszámláló PC vagy annak R15 szinonima regiszterét. A következő bájtkódra mutató cím az R14-be kerül, így a PC használata nem látható általánosan a felhasználók számára, kivéve a hibakeresés során.

CPSR: az üzemmód jelzése

A Java bájtkód-végrehajtás ill. utasításkészlet kiválasztott / bekapcsolt állapotát két bit kombinációja jelzi az ARM CPSR regiszterében (Current Program Status Register, aktuális programállapot-regiszter), a „T” bit törölt, a „J” bit beállított.

A bájtkódokat a hardver két lépésben dekódolja (szemben a Thumb és ARM kódok egy lépéses dekódolásával) és a hardveres és szoftveres dekódolás közötti váltás (a Jazelle mód és ARM mód között) kb. 4 órajelciklust igényel.

A Jazelle hardverállapotba való sikeres belépéshez a CP14:C0(C2)[bit 0] regiszterben a JE (Jazelle Enable, Jazelle engedélyezett) bitet be kell állítani; a JE bit törlésével egy (privilegizált) operációs rendszer magas szinten felülbírálhatja, hogy az alkalmazásprogramok a Jazelle hardveres gyorsítást használják.

Emellett a belépéskor a CP14:C0(C1)[bit 1]-ben található CV (Configuration Valid, konfiguráció érvényes) bitet be kell állítani, amely azt jelzi, hogy a Jazelle állapotba való belépés megtörtént és a hardver számára konzisztens beállítás létezik.

BXJ: váltás Javába

A BXJ utasítás megpróbál Jazelle állapotba váltani, és ha az engedélyezett és sikeres, beállítja a „J” bitet a CPSR-ben; másképp „átesik” ezen a lépésen és szabványos BX (elágazás) utasításként viselkedik. Az egyetlen alkalom, amikor egy operációs rendszernek vagy debuggernek teljes mértékben tisztában kell lennie a Jazelle üzemmóddal, az egy hibás vagy csapdázott utasítás dekódolása. A BXJ elágazási kérés végrehajtása előtt a következő Java utasításra mutató programszámláló (PC) regisztert a csatolóregiszterbe (R14, Link Register) kell írni, mivel a hardveres vagy szoftveres feldolgozástól függetlenül a rendszernek tudnia kell, hogy hol kezdje a dekódolást.

Mivel az aktuális állapot a CPSR-ben van tárolva, a feladatváltás után a bájtkód-utasításkészlet automatikusan újra kiválasztásra kerül és az aktuális Java bájtkód feldolgozása újraindul.

A Jazelle állapotú üzemmódba való belépést követően a bájtkódok háromféleképpen dolgozhatók fel: natív hardveres dekódolás és végrehajtás, szoftveresen kezelve (optimalizált ARM/ThumbEE JVM kóddal), vagy érvénytelen/illegális műveleti kódként kezelve. A harmadik eset egy elágazást vált ki egy ARM kivételes üzemmódba, a JVM töréspontok beállítására használatos 0xff Java bájtkódhoz hasonlóan.

A hardveres végrehajtás addig folytatódik, amíg a rendszer egy nem kezelt bájtkóddal találkozik, vagy kivétel lép fel. A 134 és 149 közötti bájtkódokat (a JVM specifikációban definiált 203 bájtkód közül) közvetlenül a hardver értelmezi és hajtja végre.

Alacsony szintű regiszterek

A hardveres virtuális gép által használt alacsony szintű konfigurációs regiszterek az ARM CP14 koprocesszor c0 regiszterében vannak tárolva. A regiszterek lehetővé teszik a hardveres gyorsító érzékelését, engedélyezését vagy letiltását (ha az rendelkezésre áll).

  • A Jazelle azonosító regiszter (Identity Register) a CP14:C0(C0) regiszterben csak olvasható minden módban.
  • A Jazelle OS vezérlőregiszter a CP14:C0(C1)-ben csak kernel módban hozzáférhető és kivételt okoz felhasználói üzemmódból történő hozzáférés esetén.
  • A Jazelle fő konfigurációs regiszter (Main Configuration Register) a CP14:C0(C2) alatt felhasználói üzemmódban csak írható, kernel módban pedig írható-olvasható.

A Jazelle egy „triviális” hardveres megvalósítása (amilyen például a QEMU emulátorban található) lehetséges mindössze a BXJ opkód támogatásával (a BXJ-t normál BX utasításként kezelve) és a CP14:C0 összes Jazelléhez kapcsolódó regiszterénél RAZ (Read-As-Zero) érték visszaadásához.

Utódja, a ThumbEE

Az ARMv7 architektúra háttérbe szorította a Jazelle és a JVM bájtkódok közvetlen végrehajtásának fontosságát. Megvalósítási szempontból a Jazelle-hez már csak triviális hardveres támogatásra van szükség: a Jazelle módba való belépés és kilépés támogatására, de Java bájtkódok végrehajtására nem.

Ehelyett a Thumb végrehajtási környezet (Thumb Execution Environment, ThumbEE) volt előnyben részesítve, ez azonban mára szintén elavult. A ThumbEE támogatása kötelező volt az ARMv7-A processzorokban (például a Cortex-A8 és Cortex-A9 típusokban), és opcionális az ARMv7-R processzorokban. A ThumbEE lefordított környezeteket célzott, esetleg JIT technológiák használata mellett. Ez az üzemmód egyáltalán nem Java-specifikus, és teljesen mértékben dokumentált; sokkal szélesebb körű elterjedést vártak tőle, mint amit a Jazelle el tudott érni.

A ThumbEE egy változata a Thumb2 16/32 bites utasításkészletnek. Integrálta a null pointer ellenőrzést, definiált néhány új hibamechanizmust, és újrahasznosította a 16 bites LDM és STM műveleti kódszakaszt, hogy támogasson néhány más utasítást, például a tartományellenőrzést, egy új kezelőhívási sémát és egyebeket. Ennek megfelelően, a Thumb vagy Thumb2 kódot előállító fordítóprogramok módosíthatók úgy, hogy a ThumbEE alapú futtatókörnyezetekkel működjenek.

Jegyzetek

  1. ↑ US 7089539. , "Program instruction interpretation"
  2. ↑ "Artificial Intelligence Enhanced Computing". 2014. március 28. dátummal az eredeti címről archiválva.
  3. 1 2 3 4 5 "ARM Architecture reference Manual" (PDF). arm.com. Archived from the original on 2007. január 26.
  4. ↑ "Shanghai Jade Licenses ARM Prime Starter Kit for DCP SoC". Design And Reuse. 2004. január 12. 2004. február 6. dátummal az eredetiből archiválva.
  5. ↑ "CPM Design Online - Using ARM DBX hardware extensions to accelerate Java in space-constrained embedded apps". 2008. december 21. dátummal az eredeti címről archiválva. Hozzáférés: 2009. február 25.
  6. ↑ "Release Notes - CLDC HotSpotTM Implementation - Version 1.1.3". java.sun.com. 2007. október 26. Archived from the original on 2008. június 2.
  7. 1 2 "ARM Whitepaper, Accelerating to meet the challenge of embedded Java" (PDF). jp.arm.com. 2004. április 14. 2009. január 9. dátummal az eredeti (PDF) címről archiválva.
  8. ↑ Intel, ARM Architecture introduction. Dead link, February 2020[halott link]
  9. ↑ Marinas, Catalin (2007. június 4.). "Re: [RFC][PATCH] Add ARM Jazelle state info in show_regs tombstone". linux-arm-kernel (Mailing list). Hozzáférés: 2020. június 5.
  10. ↑ ARM Whitepaper, High performance Java on embedded devices
  11. 1 2 "ARM アーキテクチャ リファレンスマニュアル" [ARM Architecture Reference Manual] (PDF). jp.arm.com (japán nyelven). 2008. szeptember 10. 2008. szeptember 10. dátummal az eredeti (PDF) címről archiválva.
  12. ↑ ARM, ARM1026EJ-S Technical reference Manual
  13. ↑ ARM reference Manual, Understanding ARM11 Processor Power Saving Modes
  14. ↑ ARM reference, Cortex-A8 Technical reference Manual

Fordítás

Ez a szócikk részben vagy egészben a Jazelle című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.

Források

További információk

Kapcsolódó szócikkek