原创 KVM 加载过程 -转

2011-2-21 20:41 1657 8 8 分类: MCU/ 嵌入式

1.从 main (int argc, char* argv[])开始
分析argv,如果在命令行中包含了java堆的大小,则保存堆大小;随后从命令行获取类路径(即要运行的class路径)。
2.调用StartJVM(argc, argv)函数,开始kvm的运行。
虚拟机对运行中的错误处理采用了下面的方式:
ERROR_TRY {
虚拟机运行代码;
}ERROR_CATCH(error) {
错误处理代码;
}ERROR_END_CATCH
在虚拟机运行代码出现任何运行期异常时都会调用ERROR_THROW函数(在GLOBAL.H定义),ERROR_THROW将跳转到错误处理代码部分,由错误处理代码决定虚拟机的走向。
以下函数都属于"虚拟机运行代码"部分:
(1).CreateROMImage()
这个函数主要是为了加快KVM启动的速度,在解析指令之前载入JAVA的系统类库。
要执行这个函数必须先定义了ROMIZING以及RELOCATABLE_ROM这两个宏,这都是
允许预载入的选项,后一个是表示可以重新载入系统类。一般我们可以不选这两
个宏(将其定义为0即可)
(2).#if ASYNCHRONOUS_NATIVE_FUNCTIONS
/* Initialize asynchronous I/O system */
InitalizeAsynchronousIO();//在虚拟机启动以前要保IOCB(I/O控制块)为空,如果#endif //有其他的I/O活动,虚拟机等待这个线程结束

(3).InitializeNativeCode();//初始化Native方法,与具体平台有关的函数,在
vmextra目录下有这个函数
(4).InitializeVM();//初始化虚拟机的运行期数据
(5).InitializeGlobals();初始化所有的全局变量
(6).InitializeMemoryManagement()//初始化内存管理单元;创建java堆以及虚拟机
内存块链表的头指针
(7).InitializeHashtables()//调用createHashTable(HASHTABLE *tablePtr, int
bucketCount)创建哈西表到指针tablePtr所指的位
置,bucketCount是指哈西表所应占的kvm内存块数目
(8).InitializeInlineCaching()//初始化内嵌缓冲(为了加速虚拟机指令的查找开辟
的内存区域)。
(9).InitializeClassLoading()//根据命令行的classpath参数,设置类载入器,(此
函数与平台有关)
(10).InitializeJavaSystemClasses()//载入系统类
(11).InitializeVerifier()//初始化字节码检验器
(12).InitializeEvents()//初始化虚拟机线程事务系统
(13).mainClass = (INSTANCE_CLASS)getClass(replaceLetters(argv[0], '.', '/'))
//得到main方法
(14).ARRAY arguments = readCommandLineArguments(argc - 1, argv + 1)
//获取命令行的参数
(15).InitializeThreading(mainClass, arguments)//准备运行
(16).initializeClass(JavaLangOutOfMemoryError);
//初始化相应的系统类
initializeClass(JavaLangSystem);
initializeClass(JavaLangString);
initializeClass(JavaLangThread);
initializeClass(JavaLangClass);
(17).Interpret()//开始解释

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /3 下一条