7. Estructura de Directorios. 7.1. Estructura Genérica. El contenido de la implementación de referencia del CLDC de J2ME propuesta por Sun tiene el siguiente contenido: • • • • • • • • Api: contiene el código fuente Java de la librería suministrada con esta distribución. Bin: contiene los archivos binarios ejecutables ya compilados de las clases Java. Build: contiene los makefiles para construir la KVM. Doc: Documentación. Jam: contiene el código fuente del componente opcional Java Apliccation Manager(JAM) que es suministrado junto con la KVM. Kvm: código fuente de la KVM y objeto de nuestro estudio en este proyecto. Samples: código fuente e iconos de algunos ejemplos ilustrativos. Tools: código fuente e iconos de una serie de utilidades: o JavaCodeCompact. o Preverifier. o KDWP Debug Proxy o Palm tools. Dicho contenido puede descargarse del sitio oficial de Sun: www.sun.com. 7.2. Estructura directorios ficheros código fuente KVM. Dentro del directorio correspondiente al código fuente de la KVM tenemos varios directorios que agrupan los archivos de código dependiendo del sistema operativo final en el cual se va implementar la KVM. Veamos estos directorios por separado. 7.2.1. VmCommon. Todo el código fuente común e independiente de la plataforma objetivo se aglutina en este directorio tanto los archivos con el código *.c como los archivos de cabecera con las correspondientes macros y variables de diseño. Los archivos que realizan estas funciones comunes y que analizaremos en profundidad son los siguientes: Archivo startJVM.c Descripción Inicio de la maquina virtual y lectura de bytecodes.c cache.h cache.c class.c class.h events.c events.c fields.c fields.h frame.c frame.h garbage.c garbage.h collector.c collectorDebug.c global.c global.h hashTable.c hashtable.h interpret.c interpret.h kni.c kni.h loader.c loader.h log.c log.h long.h main.h messages.h native.h native.c nativeCore.c pool.c pool.h profiling.c argumentos por la línea de comandos. Definición de los Java bytecodes necesario para el rediseño del intérprete de bytecodes que emplea la KVM respecto a la JVM. Operaciones de caché para aumentar la velocidad en la búsqueda de métodos de ejecución y para el soporte de bytecodes rápidos. Operaciones y estructuras de datos internas en tiempo de ejecución para representar las clases de Java(los *.class) Implementación del sistema de eventos. Operaciones y estructuras de datos internas en tiempo de ejecución para representar las propiedades y los métodos de las clases Java. Operaciones de soporte de excepciones y pila de objetos. Colector de basura y gestión de memoria. Variables globales y definciones. Implementacion de una Hashtable usada internamente por la KVM. Interprete de bytecodes. Soporte para la K Native Interface(KNI) Checkeo de la carga de clases y su formato requerido por el verificador de archivos de clase. Operaciones de diagnóstico y registro para depuración/profiling. Macros especiales para el soporte de operaciones de 64 bits en un diseño portable. Opciones de compilación y propiedades genéricas del sistema. Mensajes de error y warnings. Operaciones y estructuras de datos que en tiempo de ejecución representen las constantes de almacén. Operaciones y declaraciones de datos para profiling.h property.c property.h rom.h la ejecución de perfiles. Operaciones para acceder a las propiedades de sistema de Java. Macros empleadas por el ROMizer incluido dentro de la aplicación JavaCodeCompact. Plantillas de función para ciertas operaciones especificas de una maquina en particular que han de ser definidas para cada implementación de la KVM. Operaciones de mapeo de pila que se emplean para soportar recolección de basura lo mas exacta posible. Manejo de hilos de ejecución. runtime.h stackmap.c thread.c thread.h verifier.c verifier.h verifierUtil.c verifierUtil.h Verificador de archivos de clase. Tabla 7.1: Ficheros comunes a todas las plataformas. 7.2.2. VmExtra. Este directorio contiene componentes adicionales que pueden resultar útiles para un gran número de plataformas de implementación. Estos archivos incluyen por ejemplo: • • • • • Una implementación de los protocolos de comunicación para Windows y Unix más comúnmente usados. Un interfaz de archivos para la carga de clases en aquellas plataformas objetivo que tengan un sistema de archivos normal. Lectura/Creación de archivos JAR. Implementación del Java-Level Debbuger. Implementación de la interfaz KDWP (KVM Debug Wire Protocol). Además se definen una serie de macros para manejo de eventos asíncronos así como las operaciones de inicio de la maquina virtual para plataformas no basadas en ejecución desde línea de comandos como Solaris o Windows. A continuación listamos los archivos que realizan estas funciones: Archivo asyn.c asyn.h loaderFile.c Descripcion Macros para soporte de operaciones E/S asincronas. Puente a bajo nivel entre el sistema de archivos, cargador de clases y el lector JAR para aquellas plataformas que main.c jar.h inflate.h inflateint.h inflatetables.h jar.c inflate.c commProtocol.h commProtocol.c socketProtocol.h socketProtocol.c datagramProtocol.h datagramProtocol.c resource.c debugger.c debugger.h debuggerCommands.h debuggerStreams.h debuggerInputStream.h debuggerOutputStream.h debuggerSocketIO.h fakeStaticMemory.c nativeSpotlet.c nativeSpotlet.h dispongan de un sistema de ficheros real. Programa principal para aquellas plataformas que tienen un sistema de archivos y soporte de inicio de la MV desde la línea de comandos. Gestion de archivos JAR Implementaciones de los protocolos de comunicación mas comunes (comunicaciones serie,sockets, server sockets, datagramas). Implementación de un protocolo basado en flujos para lectura de recursos externos. Implementación del Java-Level Debugger y del KDWP. Definiciones de gestión de memoria que permiten a la KVM emular el modo USESTATIC especial de Windows/Unix para depurado. Define las operaciones de bajo nivel para manejo de eventos, captura de eventos del sistema operativo e invocación de los métodos que gestionan esos eventos. Tabla 7.2: Ficheros adicionales a todas las plataformas. 7.2.3. VmPort. Dentro de este directorio se incluyen el código fuente y configuraciones particulares de cada plataforma donde se va a instalar la maquina virtual. Así en la implementación de referencia del CLDC que estamos estudiando figuran dos ejemplos: una versión para Windows (VmWin) y otra para Unix (VmUnix). Así tenemos los siguientes archivos: Archivo machine_md.h Descripcion Incluye todas las definiciones de commProtocol_md.c datagramProtocol_md.c socketProtocol_md.c runtime_md.c parámetros específicos para la plataforma(sustituyendo a los de main.h) Implementaciones de los protocolos de comunicación específicos de la plataforma en cuestión. Implementación especifica de ciertos aspectos de ejecución de la maquina virtual para la plataforma objetivo. Tabla 7.3: Ficheros específicos del sistema operativo. 7.3. Conclusiones. Se puede observar como el código fuente correspondiente a la maquina virtual de la plataforma J2ME esta estructurado en una serie de directorios dependiendo de la naturaleza del contenido de los mismos. Así dentro de VmCommon se ubica el código fuente de las operaciones de la KVM comunes a todos los sistemas operativos y dispositivos y en VmPort(con Port el sistema en concreto, por ejemplo Win en Windows) el código específico del sistema operativo al cual este destinado la implementacion de la maquina virtual. En cuanto a la estructuración genérica del código se emplea la metodología típica de las aplicaciones construidas en C. Así cada módulo tiene: • • Un fichero de cabecera que contiene la declaración de los distintos elementos: métodos, variables, constantes, macros. Un fichero con extensión c que mantiene el código de implementación del módulo de las operaciones del módulo. Hay que tener en cuenta que el código fuente de VmPort es tan solo un esqueleto de cómo se construyen las operaciones específicas del sistema operativ. Por lo tanto para poder adaptar de forma adecuada la maquina virtual a nuestro sistema operativo, se hace necesario revisar y completar cuando sea necesario este esqueleto.