| # Licensed to the Apache Software Foundation (ASF) under one or more |
| # contributor license agreements. See the NOTICE file distributed with |
| # this work for additional information regarding copyright ownership. |
| # The ASF licenses this file to You under the Apache License, Version 2.0 |
| # (the "License"); you may not use this file except in compliance with |
| # the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| /** |
| \mainpage |
| |
| <h2>Porting Structure</h2> |
| |
| The class libraries use a number of external components to make them portable: |
| <ul> |
| <li>a Virtual Machine (VM),</li> |
| <li>platform porting, threading, zip support, and pooling libraries, and</li> |
| <li>existing open source floating point |
| (<a href="http://www.netlib.org/fdlibm/readme">fdlibm</a>) and |
| compression (<a href="http://www.gzip.org/zlib/">zlib</a>) libraries.</li> |
| </ul> |
| The figure below shows how these components relate to one another and identifies a "VM interface" which |
| is explained in the next section. |
| |
| \image html vmport.gif "Porting Structure" |
| \image latex vmport.pdf "Porting Structure" |
| |
| <h2>Porting to Alternate VMs</h2> |
| <br> |
| The class libraries are comprised of Java code and JNI native code. One of the design |
| objectives of the class libraries enables them to be ported to alternate VMs. |
| To support the class libraries, the VM Vendor must implement a C interface known as |
| the <a href="group__VMInterface.html">VM Interface</a> and a |
| Java interface consisting of a small number of Java classes known as the |
| <a href="../../kernel_doc/html/index.html#KernelJavaClasses">Kernel Java classes</a>. |
| |
| The Kernel classes are considered part of the VM component since the VM and these |
| classes may understand each other's implementations rather than necessarily only using |
| each other's external public interfaces. The VM is responsible for providing the |
| implementation of the Kernel classes, although reference implementations of parts of |
| these classes are provided as a possible starting point. |
| |
| The C <a href="group__VMInterface.html">VM Interface</a> exposes VM entry points required by |
| the class library JNI natives. |
| |
| \image html vminterfaces.gif "VM C and Java Interfaces" |
| \image latex vminterfaces.pdf "VM C and Java Interfaces" |
| |
| Implementations of platform porting, threading, compression, and floating point libraries |
| are provided with the class library code. These libraries are described in the |
| list of so-called <a href="modules.html">'modules'</a> generated from the source |
| code by doxygen. A doxygen module is simply a named collection of items from the source code. |
| The documented <a href="group__HarmonyNatives.html">Harmony Natives</a>, |
| <a href="group__Port.html">Port</a>, |
| <a href="group__Thread.html">Thread</a>, |
| <a href="group__ZipSupport.html">Zip Support</a>, |
| and <a href="group__Pool.html">Pool</a> modules are part of the contribution. |
| The <a href="http://www.gzip.org/zlib/">zlib</a> compression library, |
| used by the Zip Support, and the <a href="http://www.netlib.org/fdlibm/readme">fdlibm</a> |
| floating point library come from existing open source projects. |
| |
| So the minimum that a VM Vendor must supply is an implementation of the VM Interface |
| and Kernel Java Classes. |
| |
| <h2>Physical Packaging</h2> |
| |
| The packaging of Harmony code and a VM into executable programs and DLLs is shown |
| below with an indication of how these link together. |
| |
| \image html packaging.gif "Physical Packaging" |
| \image latex packaging.pdf "Physical Packaging" |
| |
| <a name = "Booting"><h2>Booting</h2> |
| |
| A launcher is provided that demonstrates the boot sequence for the VM and class library code. |
| The sample launcher can be used by any VM that implements the class library and VM interface. |
| |
| The sequence is shown below: |
| |
| <ol> |
| <li>\ref CreatePortLib "Create the port library."</li> |
| <li> |
| Load the |
| \ref HarmonyNatives "Natives library" and call |
| \ref jclglob_clear.c::JNI_OnLoad "JNI_OnLoad()" |
| to initialize the library. Note that the |
| \ref HarmonyNatives "VM library" will use the |
| \ref VMInterface "VM Interface". |
| </li> |
| <li> |
| The VM needs to be configured to use the boot classpath. |
| The boot classpath is a list of JAR files which contain the bootstrap Java class library code. |
| The launcher provides a command-line prepend of the kernel (VM-specific) classes to the VM |
| by specifying -Xbootclasspath/p to loads the kernel classes from the VM-specific subdirectory |
| of jre/bin. |
| The boot sequence configures the bootstrap class path in the JNI_OnLoad() function and |
| updates the "com.ibm.oti.system.class.path" system property using the |
| \ref VMInterface "VM Interface". Currently this is accomplished by reading the bootstrap |
| entries from the <i>bootclasspath.properties</i> file located in the |
| <i>jre/lib/boot</i> directory. |
| </li> |
| <li> |
| The VM should create the system ThreadGroup by calling |
| the \ref java::lang::ThreadGroup::ThreadGroup "ThreadGroup constructor", and stores |
| it in a private field of java.lang.Thread. |
| </li> |
| <li> |
| The VM calls a private |
| java.lang.Thread constructor to initialize a new Thread. |
| This constructor creates the "main" ThreadGroup by calling this |
| \ref java::lang::ThreadGroup::ThreadGroup "ThreadGroup constructor", |
| and the rest of the class library is loaded as a side effect |
| of initializing the Thread object. |
| </li> |
| </ol> |
| */ |