20071023 kvm CLDC
http://www.shengfang.org
移植kvm-cldc1.1到arm-linux上心得
到今天为止,移植KVM虚拟机的工作可以说是大概完成了,还有一点小的缺陷,但先把整个过程说一下吧。
所做的工作的目的是把以CLDC1.1为基础的KVM和移植到CPU是以ARM体系结构,以linux为嵌入式操作系统的开发板上。我们这里所说的linux并不是uClinux,而是一般的linux。下面说一下交差编译的环境:
* CentOS
* JDK1.4.2
* CLDC1.1
* GCC 3.4.6
* Arm-linux-gcc 2.95.3交差编译工具(在电脑里的名字是cross -2.95.3.tar.bz2)
CLDC参考实现 - Nebula KVM 0.1
前两年刚刚参与Linux手机平台的开发时,尝试做了一个KJava的虚拟机,这是其中一个较早的版本,当时只实现了一些核心的功能,使用zlib和sun参考实现中的java api才能工作,可以运行基本的hello world等程序,只限于命令行,不支持UI.
CLDC就是定义了一系列底层和kvm相关的指标,对硬件的要求更多,CLDC = 一个java运行时环境(kvm) + 一组底层的java api和类库.
这里强调的是底层,
kvm关系到语法支持,运行是支持,类加载,验证等等,这里说支持,其实都是限制,从j2se高度裁减下来的.
现在的CLDC1.1 类库和API只包括包括 java.io, java.net, java.util, and the java.lang packages.
MIDP就是利用底层的CLDC实现的一些较高级的类库的功能的一个清单,你可以把它理解为就是一个高级点的类库,
比如Alert Canvas MIDlet之类的.如果把CLDC 比做事win32 sdk, 那么MIDP就是MFC
这个类库建立在底层支持的基础上,底层的类库不同会导致MIDP的实现也不同,比如你的类库需要用到浮点数,如果
你的CLDC支持浮点数,呵呵,MIDP直接拿底层的来用就好了,如果你的CLDC不支持浮点数,没办法,你只能自己写个浮点数的类来用,
这个类的实现要用定点数来模拟,就跟当年的286一样.当然很慢咯,加上一个80287浮点协运算器来做诸如开跟号之类操作要快上几百倍.
其实CLDC支持浮点数也未必就是硬件支持,只能称之为底层支持.用起来方便一点.
要想知道哪些类是MIDP支持还是CLDC支持可以查阅sun的标准文档,有一个简单的方法就是看wtk的文档里看这个类的Since: 写的是什么就是什么
KVM可以说是JVM中比较小而且比较原始的一个版本。KVM是一般放置在嵌入式设备,比如手机等资源有限的终端内运行。KVM没有采用HotSpot JVM里面诸多优化技术,代码十分简单,有利于我们理解JAVA程序的执行过程。虽然KVM里面执行JAVA程序可能与现在PC上流行的JVM不太相同,但是大致原理是相似的。
arm-linux-gcc是针对arm + linux的开发环境的,kernel使用的是linux,不是uclinux,arm是有硬件MMU的。
而arm-elf-gcc是针对no MMU arm + uclinux的开发环境,kernel使用的是uclinux,硬件是廉价的无MMU的arm芯片。
arm-linux-gcc倒是有点类似X86 PC环境下的linux开发。
下面是一段英文的解释:
xxx-elf is for standalone application. xxx-linux is for application running on
Linux. These two toolchains are almost same, except for different macros
defined when preprocessing and different libraries linked in when performing
linking.
http://blog.csdn.net/hotdust/archive/2007/09/11/1781223.aspx
Sun Community Source Licensing (SCSL) - CLDC Reference Implementation
You must first register or log into the Sun Download Center (SDLC) and agree to the license agreement before you can download this product.
Product Description
Platform(s)
Delivery Format
Download Here
Java 2 Platform, Micro Edition
Connected Limited Device Configuration Version 1.1 Reference Implementation
Solaris Operating System, SPARC[r] Platform Edition;
Microsoft Windows 2000; and
Linux
Electronic Download
Download
Java 2 Platform, Micro Edition
Connected Limited Device Configuration Version 1.0.4 Reference Implementation
Solaris Operating System, SPARC[r] Platform Edition;
Microsoft Windows 2000; and
Linux
Electronic Download
Download
这句让我搞了半天也没明白,后来是问的老师。在arm体系结构参考手册中关于BL:
1. Sign-extending the 24-bit signed (two's complement) immediate to 32 bits.
2. Shifting the result left two bits.
3. Adding this to the contents of the PC, which contains the address of the branch instruction plus?.
它是把BL中24有符号数扩展成32位,然后左移两位,再这个数加8加到pc中。所以,我们得先把这个数减8再右移两位,好让arm的自动操作能算出正确的地址。但是我没明白arm为什么先左移再加8。
if (vec & 0xff000000)
{
printf("Handler greater than 32MBytes from vector");
}
接下来看看bl要跳转的地址,手册里规定bl跳转不能超过+-32M的地址空间。