A Jazelle DBX (, közvetlen bájtkódvé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
Fordítás
Források Use ARM DBX hardware extensions to accelerate Java in space-constrained embedded apps, embedded.com, Embedded staff, Chris Porthouse, 2007. okt. 18.
További információk
Jazelle DBX: Allow ARM processors to execute Java bytecode in hardware, Hacker News, 2024, fórumoldal
Kapcsolódó szócikkek picoJava Java processzor
Kategória:ARM architektúra
Kategória:Mikroprocesszorok