Jazelle DBX (execució directa de bytecode) és una extensió que permet a alguns processadors ARM executar bytecode Java en maquinari com a tercer estat d'execució juntament amb els modes ARM i Thumb existents. La funcionalitat de Jazelle es va especificar a l'arquitectura ARMv5TEJ, i el primer processador amb tecnologia Jazelle va ser l'ARM926EJ-S. Jazelle es denota amb una "J" afegida al nom de la CPU, excepte per als nuclis posteriors a la versió 5, on és obligatori (encara que només de forma trivial) per a la conformitat amb l'arquitectura.
Jazelle RCT (Runtime Compilation Target) és una tecnologia diferent basada en el mode ThumbEE; admet la compilació anticipada (AOT) i just-in-time (JIT) amb Java i altres entorns d'execució.
L'ús més destacat de Jazelle DBX és per part dels fabricants de telèfons mòbils per augmentar la velocitat d'execució de jocs i aplicacions Java ME. Una màquina virtual Java (JVM) compatible amb Jazelle intentarà executar bytecode Java en maquinari, mentre torna al programari per a operacions de bytecode més complicades o menys utilitzades. ARM afirma que aproximadament el 95% del bytecode en l'ús típic d'un programa acaba processant-se directament al maquinari.
Les especificacions publicades són molt incompletes, i només són suficients per escriure codi de sistema operatiu que pugui suportar una JVM que utilitzi Jazelle. La intenció declarada és que només el programari JVM hagi de dependre (o pugui dependre) dels detalls de la interfície del maquinari. Aquesta vinculació estreta facilita que el maquinari i la JVM evolucionin junts sense afectar altres programes. De fet, això dóna a ARM Holdings un control considerable sobre quines JVM poden explotar Jazelle. També impedeix que les JVM de codi obert utilitzin Jazelle. Aquests problemes no s'apliquen a l'entorn ARMv7 ThumbEE, el successor nominal de Jazelle DBX.
Implementació L'extensió Jazelle utilitza traducció binària de baix nivell, implementada com una etapa addicional entre les etapes de fetch i descodificació a la cadena d'instruccions del processador. Els bytecodes reconeguts es converteixen en una cadena d'una o més instruccions ARM natives.
El mode Jazelle trasllada la interpretació de la JVM al maquinari per a les instruccions JVM simples més comunes. Això pretén reduir significativament el cost de la interpretació. Entre altres coses, això redueix la necessitat de compilació just-in-time i altres tècniques d'acceleració de la JVM. Les instruccions de la JVM que no estan implementades en el maquinari Jazelle provoquen que s'invoquin les rutines adequades a la implementació de la JVM compatible amb Jazelle. No es publiquen els detalls, ja que tots els components interns de la JVM són transparents (excepte el rendiment) si s'interpreten correctament.
L'entrada al mode Jazelle s'efectua mitjançant les instruccions BXJ. Una implementació de maquinari de Jazelle només cobrirà un subconjunt de bytecodes de la JVM. Per a bytecodes no gestionats, o si el sistema operatiu els anul·la, el maquinari invocarà la JVM de programari. El sistema està dissenyat de manera que la JVM de programari no necessiti saber quins bytecodes s'implementen en maquinari i la JVM de programari proporciona una alternativa de programari per al conjunt complet de bytecodes.
Conjunt d'instruccions El conjunt d'instruccions Jazelle està ben documentat com a bytecode de Java. Tanmateix, ARM no ha publicat detalls sobre els detalls exactes de l'entorn d'execució; la documentació proporcionada amb la màquina virtual HotSpot Java de Sun arriba a afirmar: "Per evitar dubtes, la distribució de productes que continguin codi de programari per exercir la instrucció BXJ i permetre l'ús de l'extensió de l'arquitectura ARM Jazelle sense [...] l'acord d'ARM està expressament prohibida."
Els empleats d'ARM han publicat en el passat diversos llibres blancs que donen alguns bons consells sobre l'extensió del processador. Les versions del Manual de referència d'arquitectura ARM disponibles des del 2008 han inclòs pseudocodi per a la instrucció "BXJ" (Branch and eXchange to Java), però amb els detalls més precisos que es mostren com a "SUBARQUITECTURA DEFINIDA" i documentats en altres llocs.
Interfície binària d'aplicació (ABI) L'estat de Jazelle es basa en una convenció de crida acordada entre la JVM i l'estat del maquinari de Jazelle. Aquesta interfície binària d'aplicació no està publicada per ARM, cosa que fa que Jazelle sigui una característica no documentada per a la majoria d'usuaris i JVM de programari lliure.
L'estat complet de la màquina virtual es manté dins dels registres ARM normals, cosa que permet la compatibilitat amb els sistemes operatius existents i els controladors d'interrupcions sense modificar. Reiniciar un bytecode (com ara després d'un retorn d'una interrupció) tornarà a executar la seqüència completa d'instruccions ARM relacionades.
Hi ha registres específics designats per contenir les parts més importants de l'estat de la JVM: els registres R0–R3 contenen un àlies de la part superior de la pila de Java, R4 conté l'operand local zero de Java (punter a *this) i R6 conté el punter de la pila de Java.
Jazelle reutilitza el comptador de programa existent PC o el seu registre de sinònims R15. Un punter al següent bytecode va a R14, de manera que l'ús del PC no és generalment visible per a l'usuari excepte durant la depuració.
CPSR: Indicació de mode El bytecode de Java s'indica com el conjunt d'instruccions actual mitjançant una combinació de dos bits al CPSR (Registre d'estat del programa actual) de l'ARM. El bit "T" s'ha de posar a zero i el bit "J" s'ha de definir.
Els bytecodes són descodificats pel maquinari en dues etapes (en comparació amb una sola etapa per al codi Thumb i ARM) i el canvi entre la descodificació de maquinari i programari (mode Jazelle i mode ARM) triga ~4 cicles de rellotge.
Perquè l'entrada a l'estat del maquinari Jazelle tingui èxit, cal establir el bit JE (Jazelle Enable) del registre CP14:C0(C2)[bit 0]; l'esborrament del bit JE per part d'un sistema operatiu [privilegiat] proporciona una invalidació d'alt nivell per evitar que els programes d'aplicació utilitzin l'acceleració del maquinari Jazelle. A més, el bit CV (Configuration Valid) que es troba a CP14:c0(c1)[bit 1] ha d'estar definit per mostrar que hi ha una configuració d'estat Jazelle coherent perquè el maquinari l'utilitzi.
BXJ: Branca a Java La instrucció BXJ intenta canviar a l'estat Jazelle i, si es permet i té èxit, estableix el bit "J" al CPSR; en cas contrari, "falla" i actua com una instrucció BX (Branch) estàndard. L'únic moment en què un sistema operatiu o un depurador ha de ser plenament conscient del mode Jazelle és quan descodifica una instrucció amb errors o atrapada. El comptador de programa Java (PC) que apunta a les següents instruccions s'ha de col·locar al registre d'enllaç (R14) abans d'executar la sol·licitud de branca BXJ, ja que independentment del processament de maquinari o programari, el sistema ha de saber per on començar a descodificar.
Com que l'estat actual es manté al CPSR, el conjunt d'instruccions de bytecode es torna a seleccionar automàticament després del canvi de tasca i es reinicia el processament del bytecode Java actual.
Després d'entrar al mode d'estat de Jazelle, els bytecodes es poden processar d'una de tres maneres: descodificar-los i executar-los de forma nativa en maquinari, gestionar-los en programari (amb codi JVM ARM/ThumbEE optimitzat) o tractar-los com un opcode no vàlid/il·legal. El tercer cas causarà una branca a un mode d'excepció ARM, igual que un bytecode Java de 0xff, que s'utilitza per establir punts d'interrupció de la JVM.
L'execució continuarà en maquinari fins que es trobi un bytecode no gestionat o es produeixi una excepció. Entre 134 i 149 bytecodis (de 203 bytecodis especificats a l'especificació JVM) es tradueixen i executen directament al maquinari.
Registres de baix nivell Els registres de configuració de baix nivell, per a la màquina virtual de maquinari, es troben al coprocessador ARM "CP14 register c0". Els registres permeten detectar, habilitar o deshabilitar l'accelerador de maquinari (si està disponible).
El registre d'identitat de Jazelle al registre CP14:C0(C0) és accessible en només lectura en tots els modes. El registre de control del sistema operatiu Jazelle a CP14:c0(c1) només és accessible en mode kernel i provocarà una excepció quan s'hi accedeixi en mode usuari. El registre de configuració principal de Jazelle a CP14:C0(C2) és de només escriptura en mode usuari i de lectura i escriptura en mode kernel.
Una implementació de maquinari "trivial" de Jazelle (com la que es troba a l'emulador QEMU) només es requereix per admetre el codi d'operació BXJ en si (tractant BXJ com una instrucció BX normal) i per retornar RAZ (Read-As-Zero) per a tots els registres relacionats amb Jazelle CP14:c0.
Successor: ThumbEE L'arquitectura ARMv7 ha menystingut Jazelle i l'execució directa de bytecodes de la JVM. En termes d'implementació, ara només es requereix un suport de maquinari trivial per a Jazelle: suport per entrar i sortir del mode Jazelle, però no per executar cap bytecode de Java.
En canvi, s'havia de preferir el Thumb Execution Environment (ThumbEE), però des de llavors també ha estat obsolet. El suport per a ThumbEE era obligatori en els processadors ARMv7-A (com ara el Cortex-A8 i el Cortex-A9), i opcional en els processadors ARMv7-R. ThumbEE es va centrar en entorns compilats, potser utilitzant tecnologies JIT. No era gens específic de Java i estava completament documentat; es preveia una adopció molt més àmplia de la que Jazelle va poder aconseguir.
ThumbEE era una variant del conjunt d'instruccions Thumb2 de 16/32 bits. Va integrar la comprovació de punters nuls; va definir alguns nous mecanismes d'error; i va reutilitzar l'espai d'operacions LDM i STM de 16 bits per admetre algunes instruccions com ara la comprovació de rangs, un nou esquema d'invocació del controlador i més. En conseqüència, els compiladors que produïen codi Thumb o Thumb2 es podien modificar per funcionar amb entorns d'execució basats en ThumbEE.
Referències
Categoria:Microprocessadors d'ARM Categoria:Java